题目:
输入一个链表,输出该链表中倒数第k个结点。
思路1:
自然而然想到使用容器(列表、堆栈、数组等)保存链表,然后直接查询
def FindKthToTail(head, k):
if not head or k<1:
return None
# 使用列表保存链表结构
stack = []
cur = head
while cur:
stack.append(cur)
cur = cur.next
# 非法情况,即K大于链表长度
if k > len(stack):
return None
return stack[-k]
思路2:
使用两个指针,同时都指向头结点,首先第一个指针走k-1步,即第一个结点到达第k个结点;然后两个指针同时往后移动,直到第一个指针到达链表末尾时停止,这时候第二个指针的指向是倒数第k个结点,最后返回第二个指针指向的节点
def FindKthToTail(head, k):
if not head or k<1:
return None
p1 = head
p2 = head
# 首先将p1移动k-1步,到达第k个节点
for _ in range(k-1):
p1 = p1.next
if p1 == None: # 判断k的值是否大于链表长度,如果大于的话,p1会指向None
return None
# 当p1走到链表最后一个节点的时候,p2位于倒数第k个位置
while p1.next:
p1 = p1.next
p2 = p2.next
return p2