LeetCode 19

终于碰见了和数据结构相关的题目了,这也意味着复杂度在增加。来看看这道题吧,删除链表的倒数第k个节点,我们有必要先找出链表的长度然后再确定倒数第k个节点吗?我觉得这是没必要的。因为我们的方法比这样更巧,听起来高大尚一些。解题思路以及注意事项如下:

1.我采用的是两个指针,一快一慢,快的先走k+1步,然后快指针和慢指针一起走,直到快指针走到尾

2.为什么要快指针要走k+1步呢?我们仔细想想一下,我们是通过慢指针来决定要删除的节点的,如果慢指针刚刚好指在要删除的节点上,那么恭喜你,你需要再遍历一遍链表,找到慢指针的前一个节点,然后删掉慢指针,最后链接链表。

3.所以快指针 fast 走k+1步是有道理的,这种情做法需要考虑一种特殊情况,那就是要删除的是头结点的情况,我解决的办法是利用fast指针终止的位置来判断的,即:

int m=K+1;
while(m && fast)
{
	fast = fast->next;
	--m;
}
最后判断m的值:

(1).若m>1,那么说明链表长度不够,直接退出 

(2).若m==1,这就说明要删除的节点是头结点,这时候把头节点指向下一个节点然后返回 

(3).其他情况则很简单,慢指针指向要删除的节点的前一个节点,我们正常处理就行了

所以整个代码如下:

/**
 * 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) {
        //删除链表的倒数第n个节点,这个题的思路是快慢指针,快指针先走n步,然后快慢一起走
        if(head == NULL || n < 0)
        {
            return NULL;
        }
        ListNode *fast=head;
        ListNode *slow=head;
        int m=n+1; //返回被删除位置的前一个位置
        while(fast && m)
        {
            fast=fast->next;
            --m;
        }
        if(m >1)
        {//链表的长度不够n,为什么控制条件要大于1呢,因为我找的是被删除节点的前一个节点
            return NULL;
        }
        while(fast)
        {
            fast=fast->next;
            slow=slow->next;
        }
        if(m == 1)
        {//删除的节点是头结点
            head = head->next;
            delete slow;
        }
        else
        {
            ListNode *toBedel = slow->next;
            slow->next=slow->next->next;
            delete toBedel;
        }
        return head;
    }
};
最后我还是附上这个吧




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值