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

    题目描述:

    给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
    
    示例:
    
    给定一个链表: 1->2->3->4->5, 和 n = 2.
    
    当删除了倒数第二个节点后,链表变为 1->2->3->5.
    说明:
    
    给定的 n 保证是有效的。
    
    进阶:
    
    你能尝试使用一趟扫描实现吗?

    代码实现:(暴力解决)

    class Solution {
    public:
        ListNode* removeNthFromEnd(ListNode *head, int n) {
            ListNode *dummyNode = new ListNode(0);
            dummyNode->next = head; 
            ListNode* p = head;
            int size = 0;
            while(p != NULL)
            {
                p = p-> next;
                size++;
            } 
            int ans = 0;
            // ListNode* flag ;
            p = dummyNode;
            while(p != NULL)
            {
               
                if(ans + n == size  )
                {
                    ListNode* k = p-> next;
                    p -> next = k -> next ;
                    // p = k; 
                    delete(k);
                }
             p = p -> next;
              ans++;
                
            }
        
            return dummyNode -> next ;
            // return head;
        }
    };

    做题总结:

    1:要先引入一个哑结点,这道题中的哑结点就是dummyNode ,是在head之前附加了一个节点,原因是如果要删除head链表中第一个节点若不引入哑结点,还要单独考虑情况,而有了哑结点便统一了操作。

    解法二:(双指针)

    class Solution{
        public:
            ListNode* removeNthFromEnd(ListNode* head,int n)
            {
                ListNode* dummyHead = new ListNode(0);
                dummyHead -> next = head;
                
                ListNode* p = dummyHead;
                ListNode* q = dummyHead;
                for(int i = 0 ; i < n+1 ; i ++)
                {
                    q = q-> next;
                }
                while(q){
                    p = p-> next;
                    q = q-> next;
                }
                
                ListNode* delNode = p->next;
                p->next = delNode->next;
                delete delNode;
                
                return dummyHead->next;
            }
    };

    启示:

    这种解法是思路上的启发,运用了哑结点和双指针p和q,将q移动到距离p 有n 的节点位置上,然后两指针保持距离一起移动,直到q到NULL位置,而p指向的节点的后一个节点就是要删除的节点。

  • 相关阅读:
    Win7系统重启网卡批处理
    第一个应用程序HelloWorld
    JS异步流程控制(序列模式、并发模式、有限并发模式)
    bootstrap+MVC3在Moon.Orm中的应用(含有代码下载)
    google guava使用例子/示范
    证明Hadoop工作的正确性和可靠性只需4步图文并茂的过程
    python 图 自身遍历 及弱引用使用
    界面布局决定系统设计的成败
    .NET:栈的生长与消亡.
    IIS 6 & Server.MapPath
  • 原文地址:https://www.cnblogs.com/wtzmz/p/13376472.html
Copyright © 2011-2022 走看看