【题目】在单链表和双链表中删除倒数第k个节点
要求:如果链表长度为N,时间复杂度O(N),额外空间复杂的O(1)
public class DeleteLastKthNode {
public static class Node {
public int value;
public Node next;
public Node(int value) {
this.value = value;
}
}
public static class DoubleNode {
public int value;
public DoubleNode next;
public DoubleNode last;
public DoubleNode(int value) {
this.value = value;
}
}
public static Node removeLastKthNode(Node head, int k) {
if (head == null || k < 1) {
return head;
}
Node cur = head;
while (cur != null) {
cur = cur.next;
k--;
}
if (k == 0) {
head = head.next;
}
if (k < 0) {
cur = head;
while (++k != 0) {
cur = cur.next;
}
cur.next = cur.next.next;
}
return head;
}
public static DoubleNode removeLastKthDNode(DoubleNode head, int k) {
if (head == null || k < 1) {
return head;
}
DoubleNode cur = head;
while (cur != null) {
k--;
cur = cur.next;
}
if (k == 0) {
head = head.next;
head.last = null;
}
cur = head;
if (k < 0) {
while (++k != 0) {
cur = cur.next;
}
DoubleNode newNext = cur.next.next;
cur.next = newNext;
if (newNext != null) {
newNext.last = cur;
}
}
return head;
}
}