【题目】
分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点。
【要求】
如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1)。
【解答】
单链表:
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;
}
对于双链表的调整,几乎与单链表的处理方式一样,注意last指针的重连即可。
public class DoubleNode{
public int value;
public DoubleNode last;
public DoubleNode next;
public DoubleNode(int data){
this.value = data;
}
}
public DoubleNode removeLastKthNode(DoubleNode head,int lastKth){
if(head == null || lastKth < 1){
return head;
}
DoubleNode cur = head;
while(cur != null){
lastKth --;
cur = cur.next;
}
if(lastKth == 0){
head = head.next;
head.last = null;
}
if(lastKth < 0){
cur = head;
while(++lastKth != 0){
cur = cur.next;
}
DoubleNode newNext = cur.next.next;
cur.next = newNext;
if(newNext != null){
newNext.last = cur;
}
}
return head;
}