您的位置:首页 > 其它

[链表]-在单链表和双链表中删除倒数第K个节点

2017-12-04 18:01 295 查看
【题目】

分别实现两个函数,一个可以删除单链表中倒数第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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐