链表经典算法:反转、合并与排序
链表是一种常见的基础数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表具有插入和删除操作灵活等优点,在许多算法中扮演着重要角色。本文将围绕链表这一主题,探讨链表的经典算法:反转、合并与排序。
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. 总结
本文介绍了链表的基本操作、反转、合并与排序等经典算法。通过这些算法,我们可以更好地理解和应用链表这一数据结构。在实际应用中,根据具体需求选择合适的算法,可以有效地提高程序的性能和效率。
Comments NOTHING