程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> LeetCode 203 Remove Linked List Elements(移除鏈表元素)(*)

LeetCode 203 Remove Linked List Elements(移除鏈表元素)(*)

編輯:C++入門知識

LeetCode 203 Remove Linked List Elements(移除鏈表元素)(*)


翻譯

從一個鏈表中移除所有值為val的元素。

例如
給定:1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val = 6
返回:1 --> 2 --> 3 --> 4 --> 5

原文

Remove all elements from a linked list of integers that have value val.

Example
Given: 1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val = 6
Return: 1 --> 2 --> 3 --> 4 --> 5

分析

昨天中午收到一個好消息於是許久不能平靜,反反復復這題一直錯誤,越改越混亂,畢竟邏輯已經在九霄雲外了……

今早刪了昨天的代碼重新來過,一次通過。

我新設置了3個索引:

newHead,指向頭部,用於最後返回
pre,指向移動中節點的前一個節點
cur,指向移動中的節點

我就不畫圖了……通過cur的不斷循環,while內部判斷cur的值是否與給定的val相等,分別作相應操作。最後pre和cur都移動到鏈表後面了,返回整個鏈表的重任就交給了newHead了。

還有一個關鍵問題是,上面的方法是從鏈表第二個節點開始與val作比較,那麼第一個節點呢?昨天的思路現在想想真是太繁瑣了,昨天是用了兩個while循環,第二個就是上文說到,第一個用於判斷鏈表頭部的元素是否和val相等。

但是更好的方法是直接使用newHead。之前不是對鏈表第二個元素到最後一個元素做了判斷嘛,返回的時候直接返回newHead或newHead的下一個元素不就好了?

代碼

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        if (!head) return NULL;
        ListNode *pre = head, *cur = head->next, *newHead = pre;
        if (!cur) return pre->val == val ? NULL : pre;
        while (cur) {
            if (cur->val == val) pre->next = cur->next;
            else pre = pre->next;
            cur = cur->next;
        }
        if (newHead->val == val) return newHead->next;
        else return newHead;;
    }
};

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved