要考研了 每天一到两道leetcode 记录我的考研历程 加油奥利给!
19.删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
题解:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *p = head;
ListNode *q = p;
int num = 0;
while (p != NULL)
{
num++;
p = p->next;
}
p = head;
if ((num - n) >= 0)
{
for (int i = 0; i < num - n; i++)
{
q = p;
p = p->next;
}
if (p == head)
{
head = p->next;
}
else
{
q->next = p->next;
}
}
return head;
}
};
优解:
通过快指针和慢指针,快指针先指向n之后的节点 然后慢指针和快指针一起走
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *fast = head;
ListNode *later = head;
ListNode *prior = head;
for (int i = 0; i < n; i++)
{
if(fast)
fast = fast->next;
}
while (fast)
{
prior = later;
later = later->next;
fast = fast->next;
}
if(later==head)
{
head=later->next;
}
else prior->next = later->next;
return head;
}
};