实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
1. 第一种思路:计算总长度
很容易想到,先扫描一遍求出链表的总长度,然后算出正向的位置,再用一次遍历完成节点的定位。
function kthToLast1(head: ListNode | null, k: number): number {
let count = 0
let cur = head
while(cur) {
count++
cur = cur.next
}
let positive = count - k
let cur2 = head
while (positive--) {
cur2 = cur2.next
}
return cur2.val
};
2. 第二种思路:双指针
- 先将第一个指针从头节点出发,移动
k
个节点 - 第二个指针再从头节点出发,与第一个指针同步移动,当一个指针访问到链表尾部时,第二个指针还剩下
k
个达到链表尾部,即倒数第k
的位置。
function kthToLast(head: ListNode | null, k: number): number {
let pre: ListNode | null = head
while(k--) {
pre = pre!.next
}
let cur = head
while(pre) {
pre = pre.next
cur = cur.next
}
return cur.val
};