题目
实现一个函数,可以删除单链表中倒数第K个节点。
要求
如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1)。
思路
如果链表为空或者K值小于1,直接返回head即可,除此之外,从头遍历链表,并让K-1.
链表和K值 | 走到的节点 | K变化 |
1->2->3 K=4 链表不存在倒数第4个节点 | 1->2->3 | 3 2 1 |
1->2->3 K=3 链表倒数第3个节点是1节点 | 1->2->3 | 2 1 0 |
1->2->3 K=2 链表倒数第2个节点是2节点 | 1->2->3 | 1 0 -1 |
由上表三种情况可知
- 若K=0,返回head即可
- 若K=1,返回head.next即可,即只删除第一个节点
- 若K<0,如上表中最后一行,想要删除2,需要找到1,然后1—>3,达到删除节点2的目的
具体方法如下:
1>重新从头开始遍历链表,每移动一步,将K值加1
2>当K值等于0时,移动停止,当前节点即为要删除节点的前一个节点。
对2>进行解释:如果链表长为N,如果要删除倒数第K个节点,则该节点的前一个节点为第N-K个节点。在第一次遍历后,K值变为K-N;和N-K为相反值,所以在第二次遍历时,K的值不断加1,到0停止,就会停到第N-K个节点的位置。
源码
public class Node{
public int value;
public Node next;
public Node(int data){
this.value=data;
}
}
public Node removeLastKthNode(Node head,int lastKth){
if(head==null||lastKth<1){
return head;
}
Node cur=head;
while(cur!=null){
lastKth--;
cur=cur.next;
}
if(lastKth==0){
head=head.next;
}
if(lastKth<0){
cur=head;
while(++lastKth!=0){
cur=cur.next;
}
cur.next=cur.next.next;
}
return head;
}