题目
链表中倒数第k个节点
本题需要考虑代码的鲁棒性: 1.输入的是空链表? 2.k比输入的链表的长度更大? 3.k如果等于0,倒数第0个节点,没意义?
一、思路一
删除链表中的倒数第k个节点,假设链表的长度为n,则需要删除链表的第n-k+1个节点。遍历一次,得到链表的长度。在遍历一次,当前计数为n-k+1时,就是当前节点。
def find_kth_to_tail_1(head, k):
if not head or k == 0:
return None
p1 = head
link_len = 0
while p1.next:
p1 = p1.next
link_len += 1
# k是否大于链表长度
if k > link_len:
return None
count = 0
p1 = head
while p1.next and count < link_len-k+1:
p1 = p1.next
count += 1
二、思路二
如何才能在遍历一次链表的效率下,输出倒数第k个节点?
设置两个指针p1,p2
让p1比p2先走k-1步,则当p1走到链表的结尾时,p2指向的就是倒数第k个节点。
def find_kth_to_tail_2(head, k):
if not head or k == 0:
return None
p1 = head
p2 = head
count = 0
while p1.next:
p1 = p1.next
if count < k-1:
count += 1
elif count == k-1:
if p2.next:
p2 = p2.next
else:
return None
# k是否大于链表长度
if count < k-1:
return None
else:
return p2.var