牛客题霸 [删除链表的倒数第n个节点] C++题解/答案

题目描述

给定一个链表,删除链表的倒数第n个节点并返回链表的头指针
例如,
给出的链表为:1->2->3->4->5, n= 2.
删除了链表的倒数第n个节点之后,链表变为1->2->3->5.
备注:
题目保证n一定是有效的
请给出请给出时间复杂度为O(n)的算法

题解:

有个小技巧,叫什么名字我也不知道
如果你想让a到达倒数第n个节点,可以先复制一个b和a一样,然后b先跑n个节点,然后b和a再一起跑,当b跑到头时,a正好就在倒数第n个节点上,仔细考虑考虑这是为什么?
然后a->next=a->next->next;
就是直接越过第n个节点,让第n-1个与n+1个链接起来

代码:

/** * struct ListNode { * int val; * struct ListNode *next; * }; */

class Solution {
   
public:
    /** * * @param head ListNode类 * @param n int整型 * @return ListNode类 */
    ListNode* removeNthFromEnd(ListNode* head, int n) {
   
        // write code here
        if(!head)return head;
        ListNode* a=new ListNode(0);
        a->next=head;
        ListNode* pre=a;
        ListNode* p=a;
        for(int i=1;i<=n;i++)
        {
   
            pre=pre->next;
        }
        while(pre->next)
        {
   
            pre=pre->next;
            p=p->next;
        }
        p->next=p->next->next;
        return a->next;
    }
};