数据结构与算法之链表 链表经典算法 反转 / 合并 / 排序

数据结构与算法阿木 发布于 16 天前 4 次阅读


链表经典算法:反转、合并与排序

链表是一种常见的基础数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表具有插入和删除操作灵活等优点,在许多算法中扮演着重要角色。本文将围绕链表这一主题,探讨链表的经典算法:反转、合并与排序。

1. 链表的基本操作

在讨论链表的算法之前,我们先来了解一下链表的基本操作,包括创建链表、插入节点、删除节点和遍历链表。

1.1 创建链表

python

class ListNode:


def __init__(self, value=0, next=None):


self.value = value


self.next = next

def create_linked_list(values):


if not values:


return None


head = ListNode(values[0])


current = head


for value in values[1:]:


current.next = ListNode(value)


current = current.next


return head


1.2 插入节点

python

def insert_node(head, value, position):


new_node = ListNode(value)


if position == 0:


new_node.next = head


return new_node


current = head


for _ in range(position - 1):


if current is None:


return head


current = current.next


new_node.next = current.next


current.next = new_node


return head


1.3 删除节点

python

def delete_node(head, position):


if position == 0:


return head.next


current = head


for _ in range(position - 1):


if current is None:


return head


current = current.next


if current.next is None:


return head


current.next = current.next.next


return head


1.4 遍历链表

python

def traverse_linked_list(head):


current = head


while current:


print(current.value, end=' ')


current = current.next


print()


2. 链表反转

链表反转是将链表中的节点顺序颠倒,使得原链表的最后一个节点变为新链表的第一个节点。以下是链表反转的两种实现方法:递归和迭代。

2.1 递归实现

python

def reverse_linked_list_recursive(head):


if not head or not head.next:


return head


new_head = reverse_linked_list_recursive(head.next)


head.next.next = head


head.next = None


return new_head


2.2 迭代实现

python

def reverse_linked_list_iterative(head):


prev = None


current = head


while current:


next_node = current.next


current.next = prev


prev = current


current = next_node


return prev


3. 链表合并

链表合并是将两个有序链表合并成一个有序链表。以下是链表合并的两种实现方法:递归和迭代。

3.1 递归实现

python

def merge_linked_lists_recursive(l1, l2):


if not l1:


return l2


if not l2:


return l1


if l1.value < l2.value:


l1.next = merge_linked_lists_recursive(l1.next, l2)


return l1


else:


l2.next = merge_linked_lists_recursive(l1, l2.next)


return l2


3.2 迭代实现

python

def merge_linked_lists_iterative(l1, l2):


dummy = ListNode()


tail = dummy


while l1 and l2:


if l1.value < l2.value:


tail.next = l1


l1 = l1.next


else:


tail.next = l2


l2 = l2.next


tail = tail.next


tail.next = l1 if l1 else l2


return dummy.next


4. 链表排序

链表排序是将链表中的节点按照一定的顺序排列。以下是链表排序的两种实现方法:归并排序和快速排序。

4.1 归并排序

python

def merge_sort_linked_list(head):


if not head or not head.next:


return head


middle = get_middle(head)


next_to_middle = middle.next


middle.next = None


left = merge_sort_linked_list(head)


right = merge_sort_linked_list(next_to_middle)


sorted_list = merge_linked_lists_iterative(left, right)


return sorted_list

def get_middle(head):


if not head:


return head


slow = head


fast = head


while fast.next and fast.next.next:


slow = slow.next


fast = fast.next.next


return slow


4.2 快速排序

python

def quick_sort_linked_list(head):


if not head or not head.next:


return head


middle = get_middle(head)


next_to_middle = middle.next


middle.next = None


left = quick_sort_linked_list(head)


right = quick_sort_linked_list(next_to_middle)


sorted_list = merge_linked_lists_iterative(left, right)


return sorted_list


5. 总结

本文介绍了链表的基本操作、反转、合并与排序等经典算法。通过这些算法,我们可以更好地理解和应用链表这一数据结构。在实际应用中,根据具体需求选择合适的算法,可以有效地提高程序的性能和效率。