zoukankan      html  css  js  c++  java
  • Leetcode(19)-删除链表的倒数第N个节点

    给定一个链表,删除链表的倒数第 个节点,并且返回链表的头结点。

    示例:

    给定一个链表: 1->2->3->4->5, 和 n = 2.
    
    当删除了倒数第二个节点后,链表变为 1->2->3->5.

    思路:链表不同于数组,也不同于字符串,不可能事先知道它的长度,除非遍历到最后结尾。删除倒数第N个节点,可以先遍历到链表尾部,再反向遍历N个,找到倒数第N个节点删除就好了。但是这种方式明显太复杂了,如果我要删除第一个节点的话,那就要遍历两轮了。

    所以我们可以一次遍历就找到倒数第N个节点,就是采用双指针。两个指针差N-1个节点,当快的指针到达尾部的时候,慢的指针刚好指到倒数第N个,然后删除该节点就好了,我们这里注意,删除一个节点,要使它的前面的指针指向它后面的指针,所以我们还要维护一个慢的指针前面的指针,用来完成删除操作。

    另外就是在编程中要注意对特殊情况的判断,比如就一个节点,删除变为空的情况,以及删除的是头结点的情况

     ListNode* removeNthFromEnd(ListNode* head, int n) 
        {
            if(head==NULL) return head;
            ListNode*p1,*p2,*p3;
            p1=p2=p3=head;
            int num=0;
            if(num==n-1 && head->next==NULL)//只有一个节点
                return NULL;
            while(p2->next)
            {
                if(num==n-1)//当快慢指针差距n-1之后,要保持住
                {
                    p3=p1;
                    p1=p1->next;
                    num--;
                }
                p2=p2->next;
                num++;
            }
            p3->next=p1->next;
            if(p1==head)//如果要删除的节点是头结点
            {
                head=p1->next;
            }
            delete p1;
            return head;
        }
  • 相关阅读:
    Intent跳转到系统应用中的拨号界面、联系人界面、短信界面及其他
    android intent 跳转
    Android Intent 使用整理
    Android实现界面跳转
    android获取手机信息大全
    Android中实现Gallery 点击放大
    Android之TextView 详细字典
    Android发展简介
    如何成为Android高手
    系统测试阶段:
  • 原文地址:https://www.cnblogs.com/mini-coconut/p/9416196.html
Copyright © 2011-2022 走看看