leetcode 19

第一种解答,是很容易就想到的一个做法,知道一个链表的大小,已知要删除倒数的第n个节点,那么我们就知道要正着删除链表的第几个节点了,从头遍历,找到我们要删除的节点;

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 *     先上直接了当的算法吧。
 * };
 */
class Solution {
private:
    int TotalNum(ListNode * head){
        ListNode * p = head;
        int num = 0;
        while(p!=NULL){
            num ++;
            p = p->next;
        }
         return num;   
    } 
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
       ListNode * p,*q;
       p = q = head; 
       int num = TotalNum(head);
       if(n == num){  //当要删除链表的第一个元素的时候
           head = p->next;
           free(q);
           return head;
       }
       int t = num - n +1; //链表的顺序执行
       int i = 1; 
        while(p!=NULL)
        {
            if(i==t)
            {
             q->next = p->next;
             free(p);
             break;   
            }
            q = p;
            p = p->next;
            i++;
        }
        
       return head; 
    }
};

第二种解答,按照LeetCode的solution,只需要遍历链表一次,就能删除想要删除的节点。这种思路有两个指针,我们把他命名为

First 和Second。我们知道当两个人赛跑,他们的速度是一样的,当第一个先跑100米,后面他们两个再一起跑,第二位始终和第一位还是相差100米,所以,我们先让第一个指针遍历n个节点,然后,第二节点再开始遍历,当第一个指针遍历到链表的末尾的时候,第二个指针的下一个节点就是我们要删除的节点了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值