题目描述
原题链接
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
成绩
解题思路
双指针法。
设前后指针的距离差为 L,当且仅当 N = L + 1 且后指针指向链表的最后一个节点时,前指针所指向的节点就是我们需要删除的节点。
当我们删除链表的一个节点时,我们需要知道这个节点上一个节点的位置,因此需要一个变量来记录前指针指向节点的上一个节点。
如果被删除的节点恰好是第一个节点,那么直接返回第二个节点即可。
以输入 [1, 2, 3, 4, 5],N = 2 为例,图解如下:
红色指针代表前指针;
蓝色指针代表后指针;
绿色指针对应红色指针指向节点的上一个节点,初始化为 null。
代码实现
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if (head == null) { // 注意判断传入参数为空链表的情况
return null;
}
int counter = 1; // counter = 后指针与前指针距离差 + 1 = L + 1
ListNode frontIndex = head; // 前指针
ListNode backendIndex = head; // 后指针
ListNode frontLastNode = null; // 记录前指针指向节点的上一个节点
while (true) {
if (counter < n) {
counter++;
backendIndex = backendIndex.next;
}
if (counter == n) { // 满足 N = L + 1
if (backendIndex.next == null) { // 后指针指向了链表的最后一个元素
if (frontLastNode == null) { // 说明要删除的节点为第一个节点
return frontIndex.next;
} else {
frontLastNode.next = frontIndex.next;
return head;
}
}
backendIndex = backendIndex.next;
frontLastNode = frontIndex;
frontIndex = frontIndex.next;
}
}
}
}