题目
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
思路
1.双指针
2.因为涉及到删除操作,需要保存前置节点,这里建立虚拟头结点。最终返回虚拟头结点的next
实现
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
int i = 1;
ListNode* right = head;
ListNode* vir = new ListNode(0);
vir->next = head;
ListNode* left = vir;
while (i < n && right != nullptr) {
right = right->next;
++i;
}
while (right->next != nullptr) {
right = right->next;
left = left->next;
}
left->next = left->next->next;
return vir->next;
}
};
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* res = new ListNode(0);
res->next = head;
ListNode* start;
ListNode* end;
ListNode* pre;
start = head;
end = head;
pre = res;
int j = 1;
while (j < n) {
end = end->next;
j++;
}
while (end->next != NULL) {
pre = start;
start = start->next;
end = end->next;
}
pre->next = start->next;
return res->next;
}
};