数据结构与算法之链表 链表中等题 双指针应用

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


摘要:

链表是数据结构中的一种常见类型,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在处理链表问题时,双指针技术是一种非常有效的算法策略。本文将围绕链表中等题,深入探讨双指针在链表问题中的应用,并通过具体代码示例进行分析。

一、

双指针技术是一种在遍历数据结构时,使用两个指针同时或依次移动的技巧。在链表问题中,双指针的应用尤为广泛,它可以有效地解决许多中等难度的链表问题。本文将结合具体题目,详细介绍双指针在链表问题中的应用。

二、双指针在链表问题中的应用

1. 找到链表的中间节点

题目描述:给定一个链表,找出链表的中间节点。

解题思路:使用快慢指针,快指针每次移动两个节点,慢指针每次移动一个节点。当快指针到达链表末尾时,慢指针指向的就是中间节点。

代码示例:

python

class ListNode:


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


self.val = val


self.next = next

def find_middle_node(head):


if not head:


return None


slow = fast = head


while fast and fast.next:


slow = slow.next


fast = fast.next.next


return slow

测试代码


head = ListNode(1)


head.next = ListNode(2)


head.next.next = ListNode(3)


head.next.next.next = ListNode(4)


middle_node = find_middle_node(head)


print(middle_node.val) 输出:3


2. 删除链表的倒数第k个节点

题目描述:给定一个链表和一个整数k,删除链表的倒数第k个节点。

解题思路:使用两个指针,一个指针指向当前节点,另一个指针指向要删除节点的前一个节点。通过移动指针,找到倒数第k个节点的前一个节点,然后删除它。

代码示例:

python

def delete_kth_node_from_end(head, k):


dummy = ListNode(0)


dummy.next = head


slow = fast = dummy


for _ in range(k):


fast = fast.next


while fast.next:


slow = slow.next


fast = fast.next


slow.next = slow.next.next


return dummy.next

测试代码


head = ListNode(1)


head.next = ListNode(2)


head.next.next = ListNode(3)


head.next.next.next = ListNode(4)


head.next.next.next.next = ListNode(5)


k = 2


new_head = delete_kth_node_from_end(head, k)


while new_head:


print(new_head.val, end=' ')


new_head = new_head.next


输出:1 2 3 4 5


3. 合并两个有序链表

题目描述:给定两个有序链表,合并它们为一个新的有序链表。

解题思路:使用两个指针分别遍历两个链表,比较当前节点值,将较小的节点添加到新链表中,并移动指针。

代码示例:

python

def merge_sorted_lists(l1, l2):


dummy = ListNode(0)


tail = dummy


while l1 and l2:


if l1.val < l2.val:


tail.next = l1


l1 = l1.next


else:


tail.next = l2


l2 = l2.next


tail = tail.next


tail.next = l1 or l2


return dummy.next

测试代码


l1 = ListNode(1)


l1.next = ListNode(3)


l1.next.next = ListNode(5)


l2 = ListNode(2)


l2.next = ListNode(4)


l2.next.next = ListNode(6)


merged_list = merge_sorted_lists(l1, l2)


while merged_list:


print(merged_list.val, end=' ')


merged_list = merged_list.next


输出:1 2 3 4 5 6


三、总结

本文通过具体示例,详细介绍了双指针在链表问题中的应用。双指针技术是一种简单而有效的算法策略,在解决链表问题时具有广泛的应用。通过熟练掌握双指针技术,可以更好地应对链表类问题。

四、拓展

除了上述提到的应用,双指针技术还可以应用于以下链表问题:

1. 判断链表是否有环

2. 找到链表的环入口

3. 删除链表中的重复节点

4. 找到链表的倒数第k个节点(k为正整数)

通过不断练习和总结,相信读者可以熟练掌握双指针技术在链表问题中的应用。