zoukankan      html  css  js  c++  java
  • 【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 };
  • 相关阅读:
    10. 正则表达式匹配
    124. 二叉树中的最大路径和。 递归
    1028. 从先序遍历还原二叉树。 深搜
    1014. 最佳观光组合. 转变思路
    297. 二叉树的序列化与反序列化.
    1300. 转变数组后最接近目标值的数组和. 二分
    15. 三数之和. 双指针法⭐
    1. 两数之和. 哈希表
    739. Daily Temperatures. 单调栈
    面试题46. 把数字翻译成字符串. 递归
  • 原文地址:https://www.cnblogs.com/irun/p/4716775.html
Copyright © 2011-2022 走看看