题目:
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
例子:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
输入:head = [1,2], n = 1
输出:[1]
思路:
这道题很容易,但是许多人第一时间想到就是先遍历链表求出链表长度,再遍历一遍,然后遍历到倒数第N个再停止。但假设链表特别长,那么还可以再做优化,从头开始遍历链表,在遍历到第n个结点时,就新建一个标记S指向第一个结点,此时第一个结点S与已经遍历到的结点刚好相距n,也就是说,在接下来的遍历中,标记S和遍历的速度保持一致,当遍历到最后一个结点时,S指向的结点刚好就是倒数第n个结点,那么这种情况只遍历一次数组。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *pre=head;
ListNode *p=pre->next;
ListNode *now=head;
n=n-1;
while(n>0)
{
n--;
now=now->next;
}
if(now->next==NULL)
{
head=head->next;
return head;
}
now=now->next;
while(now->next!=NULL)
{
now=now->next;
pre=pre->next;
p=p->next;
}
pre->next=p->next;
//free(p);
return head;
}
};