每天一道Code 19.删除链表的倒数第n个节点

在这里插入图片描述
简单算法(暴力)
暴力很好想,没啥难度。扫一遍得到链表长度L。然后再扫一遍删第L-n个节点。
没啥写的,代码难度看上去不难。

一趟扫描
就相当于找个人用长为n的绳子把你俩绑在一起,你不会走路了坐在轮椅上(0.0)。他走到终点,你也就走到倒数第n+1个节点的面前了,伸手就能拿掉第n个结点。

整体上注意的点在于:

  1. 你这两个指针,一个领头的leader也就是代码中的first到底走到哪里second才能刚好删除要删除的节点。
  2. 万一要删除的是第一个结点怎么办。

防止删除的是第一个节点:建立一个头结点。这样删除第一个节点后直接返回NULL;
注意second位置:我写的时候全部用的for循环。简单点的话可以一个n循环先把绳子绷紧(first先走n步),然后while去让first走到链尾。

整体上,因为好久没敲代码了,天天看考研书看的习惯了->,其实还是(.)方便,发现之后懒得改了。并且第一天刷LeetCode,草率了点。以后慢慢修改。

具体代码:

/**
 * 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 *dummy=new ListNode(0);
        dummy->next=head;
        ListNode *first=dummy,*second=dummy;
        int num=0;
        for(ListNode *k=head;k!=NULL;k=k->next){
            if(num==n){
                first=first->next;
                second=second->next;
            }
            else{
                first=first->next;
                num++;
            }
        }
        second->next=second->next->next;
        return dummy->next;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值