【题目】
分别实现两个函数,一个可以删除单链表中倒数第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; }