Leetcode学习笔记(19. 删除链表的倒数第N个节点)

在这里插入图片描述
这个题的思路其实非常简单,就用快慢指针,在一次遍历中,使快指针与慢指针之间的距离为n。但是实现过程确实充满波折,怀疑人生,还需要多加练习。

思考及遇到的几个问题:

1、慢指针最终指向待删除元素还是其上一个元素?如果我们将慢指针指向删除元素,那么如何将其上一个节点的指针域指向其下一个节点,达到将其删除的目的。所以,我们应该将慢指针最终指向待删除元素的上一个元素。

2、特例情况?在n小于链表长度时,上述过程其实是非常容易实现的。但是在第一个例子就出Bug了([1], 1)链表只有一个元素,那么如何指向其上面一个元素?所以我们增加一个头结点使其指向链表的第一个元素。

3、返回什么元素?最开始想法是既然删除了节点,直接返回head即可。然而对于上述特例情况,此时head已经被删除了。所以我们返回头结点的下一个节点指向地址。
在这里插入图片描述
解题代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode *left,*right;
        ListNode *Head = new ListNode(0);
        Head->next = head;
        left = right = Head;
        for(int i=0;i<=n;i++){
            right=right->next;
        }
        while(right!=nullptr){
            right = right->next;
            left = left->next;
        }
        ListNode *temp;
        temp=left->next;
        left->next=temp->next;
        delete temp;
        return Head->next;
        delete Head;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值