[链表]-在单链表和双链表中删除倒数第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;
}
分别实现两个函数,一个可以删除单链表中倒数第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;
}
相关文章推荐
- 链表问题——在单链表和双链表中删除倒数第K个节点
- 链表之删除单链表倒数第K个节点
- 在单链表和双链表中删除倒数第k个节点
- 左程云_算法与数据结构 — 链表问题 — 02在单链表和双链表中删除倒数第K个节点
- 链表问题(1)-- 在单链表和双链表中删除倒数第K个节点
- 链表问题---在单链表和双链表中删除倒数第K个节点
- (算法)输出单链表的倒数第k个节点,删除特点的节点和从链表尾一次输出节点值
- 数据结构 在单链表和双链表中删除倒数第K个节点
- 链表问题 在单链表和双链表中删除倒数第K个节点
- python实现单链表中删除倒数第K个节点的方法
- 查找单链表的倒数第k个节点,要求只能遍历一次链表
- C语言:【单链表】查找单链表的倒数第k个节点,要求只能遍历一次
- 建立一个带附加头结点的单链表.实现测长/打印/删除结点/插入结点/逆置/查找中间节点/查找倒数第k个节点/判断是否有环
- 【链表&删除倒数第K个节点】Remove Nth Node From End of List
- 算法优解(5)-删除单链表的倒数第k个节点
- 删除链表中倒数第K个节点,
- C++实现单链表删除倒数第k个节点的方法
- C语言:【单链表】查找单链表的倒数第k个节点,要求只能遍历一次
- 左神的书——《程序员代码面试指南》之删除链表的倒数第k个节点 c++实现
- 删除单链表倒数第K个节点