leetcode 19. 删除链表的倒数第 N 个结点
链表问题,需要注意一下是倒着数还是正着数,和头结点会不会被删除即可
直接删除法
public ListNode removeNthFromEnd(ListNode head, int n) {
if (head == null) {
return null;
}
// 头结点会被删除吗?
int length = 0;
ListNode p = head;
while (p != null) {
p = p.next;
length ++;
}
if (n == length) {
return head.next;
}
int index = 1;
p = head;
// 让p停在 j - 1 位置上
// 倒数变正数
int j = length - n + 1;
while (index < j - 1) {
p = p.next;
index++;
}
p.next = p.next.next;
return head;
}
双链表法
由于我们需要找到倒数第 n 个节点,因此我们可以使用两个指针 first 和 second 同时对链表进行遍历,并且 first 比 second 超前 n 个节点。
当 first 遍历到链表的末尾时,second 就恰好处于倒数第 n 个节点。