版权声明:本文采用 知识共享署名4.0 国际许可协议进行许可。 https://blog.csdn.net/youmian6868/article/details/85222749
题目
分别实现两个函数,分别可以删除单链表和双链表中倒数第K个节点。
思路
两次遍历链表,第一遍每移动一步,就让K值减1;第二遍从头开始遍历链表,每移动一步K值加1,加到0就停止遍历,此时移动到的节点就是要删除节点的前一个节点。
代码实现
class Node {
public int value;
public Node next;
public Node (int data) {
this.value = data;
}
}
class DoubleNode {
public int value;
public DoubleNode last;
public DoubleNode next;
public DoubleNode (int data) {
this.value = data;
}
}
public class RemoveLastKthNode {
/**
* 单链表
*
* @param head
* @param lastKth
* @return
*/
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;
}
/**
* 双链表
*
* @param head
* @param lastKth
* @return
*/
public DoubleNode removeLastKthDoubleNode(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;
}
}