📌  相关文章
📜  数据结构示例-单向链表元素排序(1)

📅  最后修改于: 2023-12-03 14:54:57.369000             🧑  作者: Mango

数据结构示例-单向链表元素排序

在计算机科学中,数据结构是计算机存储、组织数据的方式。其中,单向链表是一种常见的数据结构,具有动态分配内存空间的优势,但是元素并不是固定有序的。

本文将介绍如何对单向链表进行排序。下面是一个简单的示例代码:

代码示例
class Node:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
        
def sortLinkedList(head: Node) -> Node:
    if not head or not head.next:
        return head
    
    # 使用快慢指针找到中间节点
    slow, fast = head, head
    while fast.next and fast.next.next:
        slow = slow.next
        fast = fast.next.next
    
    # 切分成两个链表
    left, right = head, slow.next
    slow.next = None
    
    left_sorted = sortLinkedList(left)
    right_sorted = sortLinkedList(right)
    
    # 合并有序链表
    dummy = Node()
    curr = dummy
    while left_sorted and right_sorted:
        if left_sorted.val < right_sorted.val:
            curr.next = left_sorted
            left_sorted = left_sorted.next
        else:
            curr.next = right_sorted
            right_sorted = right_sorted.next
        curr = curr.next
        
    curr.next = left_sorted if left_sorted else right_sorted
    return dummy.next
代码解析

代码中的 sortLinkedList 函数用来对单向链表进行排序,它的输入参数是单向链表的头结点 head,返回的是排序后的头结点。该函数首先进行递归,将链表不断切割成两半,直到链表中只剩下一个结点或者没有结点。然后对有序的两个子链表进行合并,得到排序后的链表。

合并操作使用了一个虚拟头结点 dummy,将两个有序链表合并成一个有序链表。具体实现是用指针 curr 不断指向较小值的结点,同时将该结点从链表中删去,直到其中一个链表已经全部加入到结果链表中,最后再将另一个链表加入到结果链表的末尾。

总结

单向链表是一种常见的数据结构,但是其元素并不是固定有序的。本文介绍了如何对单向链表进行排序,具体实现是将链表不断切割成两半,对两个有序链表进行合并得到排序后的链表。