题目
实现一个函数,一个可以删除单链表中倒数第k个节点
难度
简单
分析
本题比较简单,实现方法多种多样,这里提供一种方法
首先明确一点,在单链表中删除倒数第k个节点,需要找到他的前一个节点,让前一个节点指向后一个节点即可。
- 如果链表为空,或者是k小于1直接返回即可。
- 除此之外从链表头走到尾,没移动一步,就让k的值减1。
下面来分析具体的过程:
- 链表1 -> 2 -> 3, k=4 , 链表不存在倒数第四个节点。
- 走过的节点为:1 ,2 ,3
- k的变化:3, 2, 1
- 链表1 -> 2 -> 3, k=3 , 链表倒数第三个节点,就是第一个节点。
- 走过的节点为:1 ,2 ,3
- k的变化:2, 1, 0
- 链表1 -> 2 -> 3, k=2 , 链表倒数第三个节点,就是第2个节点。
- 走过的节点为:1 ,2 ,3
- k的变化:1, 0, -1
由上可知,当链表移动带尾部是,一共有三种情况:
- 当k大于0的时候,说明没有倒数第k个节点,直接返回原来链表即可
- 当k等于0的时候,说明头节点就是倒数第k个节点
- 当k小于0的时候,具体如下:
- 重头重新遍历链表,每走一步k加1
- 当k等于0的时候就停止,因为这个节点就是要删除节点的前一个节点。(这也容易理解,如链表1 -> 2 -> 3, k=2,链表的长度为 n=3。此时 3-2=1,正好是2的前一个节点)
Java代码实现
public Node removeLastKthNode(Node head, int k){if(head == null || k < 1) return head;Node cur = head;while(cur != null){k--;cur = cur.next;}if(k == 0) head = head.next;if(k < 0){cur = head;while(++k != 0){cur = cur.next;}cur.next = cur.next.next;}return head;
}
加油鸭!!!
点赞冲!!!