链表中倒数 k 个节点
个人博客
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。
题解
-
两次循环
- 第一次循环计算链表中的节点个数
- 第二次循环寻找链表倒数的第 k 个节点
-
快慢指针
- 让后节点先走 k-1 步,然后前后节点一起向后遍历
- 边界、负面测试
- k 大于链表中节点的个数
- head 是 null
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode getKthFromEnd(ListNode head, int k) { ListNode front = head,behind = head,res = null; if(front == null)return null; for(int i = 0; i < k - 1; i++){ front = front.next; if(front == null){ return null; } } while(front != null){ front = front.next; res = behind; behind = behind.next; } return res; } }
总结
-
注意边界情况
-
算法的逻辑应该自己一步一步退出来,这样才能举一反三
- 比如,我们需要思考我们要找到倒数第 k 个节点,那么我们可以从后往前遍历链表,但是此链表是单向链表。所以只能求其次,求出链表的整体长度,从头结点开始走 n-k+1 步就行了
- 那么这样子需要遍历两次,还有更优化的方法是用快慢指针。
- 一步一步来!