题解 | #删除链表的倒数第n个节点#

删除链表的倒数第n个节点

https://www.nowcoder.com/practice/f95dcdafbde44b22a6d741baf71653f6

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        auto newhead = new ListNode(-1);
        newhead->next = head;
        auto slow = newhead;
        auto fast = newhead;
        for (int i = 0; i<n+1; ++i) {
            fast = fast -> next;
        }
        if(fast == nullptr) return head->next;
        while (fast) {
            fast = fast->next;
            slow = slow->next;
        }
        slow->next = slow->next->next;
        return head;
    }
};

快慢指针,一个先移动n次,保持两个指针间距,然后一起往后移动。当快指针到空时,慢指针就是倒数n+1个,如何删除第n个

倒数n+1->倒数n->倒数n-1。(倒数n+1)->next=(倒数n+1)->next->next,这样就变成(倒数n+1)->(倒数n-1)。返回的是链表头。head。

if(fast == nullptr) return head->next;

当快指针向后移动到n+1时,恰好到空 。说明当时链表长度就是n,也就是倒数n就是头节点,所以去掉这个倒数n,

就是返回head->next;因为题目保证n是有效的就说明链表长度大于等于n。不需要考虑不够n的情况。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务