• 【LeetCode】19


    Given a linked list, remove the nth node from the end of list and return its head.

    For example,

       Given linked list: 1->2->3->4->5, and n = 2.
    
       After removing the second node from the end, the linked list becomes 1->2->3->5.
    

    Note:
    Given n will always be valid.
    Try to do this in one pass.

    Solution 1:  重点在于one pass,以空间换取时间,使用vector<ListNode*>记录list的节点,每个指针指向一个链表节点,遍历一遍list算出size,通过下标计算(size-n)即可定位到需要删除的节点

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode(int x) : val(x), next(NULL) {}
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     ListNode* removeNthFromEnd(ListNode* head, int n) {  //runtime:12ms
    12         vector<ListNode*> vec;
    13         ListNode *temp=head;
    14         int size=0;
    15         while(temp){
    16             vec.push_back(temp);
    17             temp=temp->next;
    18             size++;
    19         }
    20         vec.push_back(NULL);//必不可少,否则如果删除的是倒数第一个元素的话下面的vec[i-1]->next=vec[i+1]中i+1溢出
    21         int i=size-n;
    22         if(i==0)//delete head
    23             return head->next;
    24         else{
    25             vec[i-1]->next=vec[i+1];
    26             return head;
    27         }
    28     }
    29 };

    Solution 2: 不需要额外的空间,当正数第n个移到链表尾时,head移到倒数第n个

     1 class Solution {
     2 public:
     3     ListNode* removeNthFromEnd(ListNode* head, int n) {    //runtime:4ms
     4         ListNode *temp=head;
     5         while(--n)temp=temp->next;
     6         ListNode *del=head,*predel=NULL;
     7         while(temp->next){
     8             temp=temp->next;
     9             predel=del;
    10             del=del->next;
    11         }
    12         if(predel==NULL)return head->next;
    13         else{
    14             predel->next=del->next;
    15             return head;
    16         }
    17         
    18     }
    19 };
  • 相关阅读:
    LINQ语句中的.AsEnumerable() 和 .AsQueryable()的区别
    Linq扩展方法之All 、Any
    Linq扩展方法之Aggregate 对序列应用累加器函数
    C#开发的进化史
    C#选择文件、选择文件夹、打开文件(或者文件夹)
    XPath操作XML文档
    文档对象模型操作xml文档
    XML简介
    php获取某经纬度附近地点位置
    Yii中实例化类的四种方式
  • 原文地址:https://www.cnblogs.com/irun/p/4716775.html
Copyright © 2020-2023  润新知