题目:
实现一种算法,找出单向链表中倒数第 k 个节点。返回该链表中倒数第k个节点。
示例一:
输入:{1,2,3,4,5},2
返回值:{4,5}
说明:返回倒数第2个节点4,系统会打印后面所有的节点来比较。
示例二:
输入:{2},8
返回值:{}
思路如下:
用双指针,可省去统计链表长度操作,算法流程为:
-
初始化双指针 pre , cur 都指向头节点 head ;
-
先令 cur 走 k 步,此时 pre , cur 的距离为 k ;
-
令 pre , cur 一起走,直到 cur 走过尾节点时跳出,此时 pre 指向「倒数第 k 个节点」,返回之即可;
注意:
1.处理 k <= 0
if k <= 0 or not pHead:
return None
2.检查快指针移动时的越界
for _ in range(k):
if not cur: # 此时 cur 为 None,但循环尚未完成 k 次
return None
cur = cur.next
题解如下:
class Solution:
def FindKthToTail(self , pHead, k):
"""
:type: pHead: ListNode, k: int
:rtype: ListNode
"""
# write code here
if k <=0 or not pHead:
return None
pre, cur = pHead, pHead
for _ in range(k):
if not cur:
return None
cur = cur.next
while cur:
pre, cur = pre.next, cur.next
return pre