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

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

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

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

class Solution {
public:
    /**
     * 
     * @param head ListNode类 
     * @param n int整型 
     * @return ListNode类
     */
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode *dummyhead = new ListNode(0);
        dummyhead->next = head;
        ListNode *tmp = head;
        for (int i = 0; i < n; ++i) {
            tmp = tmp->next;
        }
        ListNode *bef = dummyhead;
        while (tmp) {
            tmp = tmp->next;
            bef = bef->next;
        }
        ListNode *nxt = bef->next;
        bef->next = bef->next->next;
        delete nxt;
        return dummyhead->next;
    }
};

可以先遍历一遍计算出链表长度,然后再计算出正数的节点位置,进行删除。

一遍遍历删除的思路:先用fast指针找到正数第k个,然后用slow指针指向头部,与fast指针同时移动,这样fast指针移动到最后一个节点,slow指针就会指向倒数第k个。

* 删除节点需要找到该节点的上一个节点bef,我们要把slow当作bef,所以slow要往前一位。

* 然而head不能再往前一位了,所以用一个dummyhead作为虚假头节点。

* dummyhead还有个好处,就是如果删除的是head,不需要额外处理指向新的head。

全部评论

相关推荐

05-03 12:45
西南大学 Java
nsnzkv:你这项目写的内容太多了,说实话都是在给自己挖坑,就算简历过了,后面面试也难受
点赞 评论 收藏
分享
吴offer选手:我卡在笔试才是最好笑的,甚至没给我发过笔试链接
投递哔哩哔哩等公司6个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务