一、题目
输入一个链表,输出该链表中倒数第k个结点。
class Solution:
def trainningPlan(self, head: ListNode) -> ListNode:
cur, pre = head, None
while cur:
tmp = cur.next
cur.next = pre
pre = cur
cur = tmp
return pre
二、解析
链表反转的过程:
原始链表:1 -> 2 -> 3 -> 4 -> None
初始化:`cur = 1`, `pre = None`
1. 第一次循环:
tmp = cur.next # tmp = 2
cur.next = pre # cur.next = None(因为 pre 初始为 None)
pre = cur # pre = 1
cur = tmp # cur = 2
反转后链表:`None <- 1`, `2 -> 3 -> 4 -> None`
2. 第二次循环:
tmp = cur.next # tmp = 3
cur.next = pre # cur.next = 1
pre = cur # pre = 2
cur = tmp # cur = 3
反转后链表:`None <- 1 <- 2`, `3 -> 4 -> None`
3. 第三次循环:
tmp = cur.next # tmp = 4
cur.next = pre # cur.next = 2
pre = cur # pre = 3
cur = tmp # cur = 4
反转后链表:`None <- 1 <- 2 <- 3`, `4 -> None`
4. 第四次循环:
tmp = cur.next # tmp = None
cur.next = pre # cur.next = 3
pre = cur # pre = 4
cur = tmp # cur = None
反转后链表:`None <- 1 <- 2 <- 3 <- 4`
此时,`cur` 为空,循环结束。最终返回 `pre`,即链表反转后的头节点:`4 -> 3 -> 2 -> 1 -> None`。链表完成了反转。