LeetCode19-删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
一、思路
难点在于你不知道最后一个节点在哪里,因此也就很难做到一趟完成。
实际上可以通过设置两个指针来解决这个问题,第一个指针与第二个指针的间隔设置为n,这样,等第一个指针指到末尾时,第二个指针恰好指到倒数第n个节点。
C++代码:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
// p1指到最后一个元素时,p2指向需要删除的节点,q指向p2的前一个节点
if (head->next == NULL)
return NULL;
ListNode *p1 = head, *p2 = head, *q;
int flag = 0;
for (int i = 0; i < n; i++)
p1 = p1->next;
while (p1 != NULL) {
p1 = p1->next;
q = p2;
p2 = p2->next;
flag = 1;
}
if (flag) {
q->next = p2->next;
delete(p2);
}
else {
head = head->next;
delete(p2);
}
return head;
}
};
执行效率: