求单向链表的倒数第k个节点
求单向链表的倒数第K个节点的原理其实非常简单,我们可以使用快慢指针的思想来解决问题。首先,我们让快指针先走k步,然后让快指针和慢指针同时向后移动,直到快指针到达链表末尾。此时,慢指针所指向的节点就是倒数第k个节点。
假设我们有一个链表:1 -> 2 -> 3 -> 4 -> 5 -> 6,我们要找到倒数第3个节点
//让快指针先向前移动两步。
1 -> 2 -> 3 -> 4 -> 5 -> 6
^ ^
| |
slow fast
然后,我们同时移动快指针和慢指针,直到快指针到达链表末尾:
//同时移动快指针和慢指针,直到快指针到达链表末尾:
1 -> 2 -> 3 -> 4 -> 5 -> 6
^ ^
| |
slow fast
此时,慢指针所指向的节点就是倒数第3个节点,即节点4。
这种方法的原理是,快指针先走k步,然后慢指针开始移动。当快指针到达链表末尾时,慢指针正好指向倒数第k个节点。这是因为快指针和慢指针之间的距离始终保持为k,所以当快指针到达末尾时,慢指针正好指向倒数第k个节点。
python代码如下:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def find_kth_from_end(head, k):
slow = fast = head
for _ in range(k):
if fast is None:
return None
fast = fast.next
while fast:
slow = slow.next
fast = fast.next
return slow
# 创建链表
head = ListNode(1)
node2 = ListNode(2)
node3 = ListNode(3)
node4 = ListNode(4)
node5 = ListNode(5)
node6 = ListNode(6)
head.next = node2
node2.next = node3
node3.next = node4
node4.next = node5
node5.next = node6
k = 3
result = find_kth_from_end(head, k)
if result:
print("倒数第{}个节点的值为{}".format(k, result.val))
else:
print("链表长度小于{}".format(k))
值得注意的是,我们写代码的时候也要注意代码的鲁棒性,对于各种情况的预先处理要想好,哪怕是一个小小的demo.