鏈表三連擊

876:鏈表的中間節點
206:反轉鏈表
143:重排練表

鏈表的中間節點

這個題一看就是最簡單的快慢指針,但是在具體實現的時候我還是猶豫思考了一下:要不要在鏈表前面放置啞節點,快指針應該什么時候判斷已經到達結尾。但是單純的想并沒有什么結果。對于這種不是算法本身的問題,而只是實現細節的問題,不要多想,沒有很大的意義,只要對于每種情況都動手(腦)模擬一遍,看這么樣能夠讓情形變得更加簡單即可。

我思考了一下以后寫了一下自己的代碼:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode* middleNode(ListNode* head) {ListNode *fast = head, *slow = head;while(fast->next != nullptr && fast->next->next !=nullptr){fast = fast->next->next;slow = slow->next;}if(fast->next == nullptr) return slow;else return slow->next;}
};

看了一下題解的實現方法,更加的簡潔。我的這種雖然能夠解決問題,但是沒有考慮另一種判斷快指針是否到達結尾的方式:fast != nullptr && fast->next != nullptr。以后應該都考慮一下,然后按照最簡單的方式實現。

反轉鏈表

就是將一個鏈表進行反轉。

不知怎么的我把題目看成了反轉輸出,可能是因為ACM里面很少對原數據進行操作的原因。反轉輸出我想到的只有遞歸輸出。

有兩種方法,迭代法和遞歸法。迭代法很容易想到,也很容易實現。

在實現迭代法的時候我在想能不能使用C++中的二級指針簡化操作(因為一般刪除之類的使用二級指針都會方便許多),但是稍微思考一下發現,我們使用二級指針是為了解決無法原地修改指針的問題,但是這個是可以直接修改的(因為每一個節點都要進行修改),而且還必須需要保存前一個節點的信息,因此使用二級指針就完全是雞肋。

遞歸法我想的是重新寫一個函數,然后進行處理。但是看到題解中一個十分優美的實現方式,雖然效率不一定高(不一定比迭代法低)

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

其中注釋部分為迭代法

遞歸法中比較難理解的就是返回的那個指針是什么,其實這個指針是鏈表的尾部,也就是新鏈表的頭部。

重排鏈表

將鏈表從頭部挑一個,尾部挑一個,然后重復這個過程直到鏈表為空。

我自己完全沒有思路,是學習了題解以后才明白的。

需要分三步完成重排:

  1. 找到鏈表的中點
  2. 將中點后面的鏈表反轉
  3. 將前后兩個鏈表合并

我手擼了一下,因為才學習了上面兩個問題,所以代碼寫的很流暢,但是為了盡可能少命名變量可能看起來有些迷惑。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:void reorderList(ListNode* head) {if(head == nullptr) return;// 求鏈表的中點ListNode *fast =head, *slow = head;while(fast->next != nullptr && fast->next->next != nullptr){fast = fast->next->next;slow = slow->next;}// 將鏈表的后半部分反轉fast = slow->next;ListNode *pre = nullptr, *next = nullptr;while(fast != nullptr){next = fast->next;fast->next = pre;pre = fast;fast = next;}fast = pre;//進行合并slow->next = nullptr;slow = head;while(fast != nullptr){next = slow->next;slow->next = fast;pre = fast->next;fast->next = next;slow = next;fast = pre;}}
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383586.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383586.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383586.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

D3力導引圖

學習力導引圖的時候在網上沒有找到什么好的教程,支離破碎地進行了一段時間的學習,還閱讀了d3的關于d3的官方文檔,但是始終覺得不的要領。這里記錄一下我學習力導引圖的一些心得以及推薦一下學習資源。 學習資源 官方文檔:https:…

Ubuntu Pycharm啟動后卡住無法操作

昨天還好好的,今天打開Pycham突然卡住了,卡在了那個preparing workspace的地方,然后在網上搜索了很多方法都沒用。直到在網上看到有個大佬說是因為搜狗輸入法的問題,我才突然記起來昨天安裝了搜狗輸入法。。。 kill掉卡住的Pycha…

327 區間和的個數

題目描述 Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive. Range sum S(i, j) is defined as the sum of the elements in nums between indices i and j (i ≤ j), inclusive. Note: A naive algorithm of O(n2) is t…

瀏覽器訪問本地文件

之前一直苦惱無法在瀏覽器訪問本地文件,尤其是寫的網頁需要調用外部數據的時候,今天學習到可以用python很方便的解決問題 如果有python3環境,直接在對應的文件夾下運行(這里是Ubuntu環境,如果是Windows應該在命令行也…

Ubuntu使用jupyter notebook +導出PDF

因為最近需要做數據分析的工作,所以復習了一下numpy和pandas,并安裝了jupyter notebook進行數據分析,這里記錄一下環境的設置。 ps:jupyter notebook真香 安裝 python3 -m pip install --upgrade pip //升級pip pip3 install jupyter使用 …

SSH:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

給服務器重裝了一下系統,結果報了上述錯誤: WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! ...在網上找…

Ubuntu20.04 更新后黑屏無法加載驅動

本來我的電腦好好的,突然提示說有可應用的更新,我想都沒想就直接更新了,可是沒想到更新以后經過grub以后就會黑屏,一動不動,在網上搜索了許多,提到的說法是在grub界面對第一個Ubuntu的啟動按e進行編輯 在倒…

每日一題:leetcode1489. 找到最小生成樹里的關鍵邊和偽關鍵邊

時隔多年我終于又開始寫博客了,主要是已經放假了,之前一直忙于考試和課設沒有時間寫博客,學習筆記也因為買了iPad的緣故大部分都是手寫的了。 假期想要把以前做過的項目都整理一下放在github和CSDN上。 也已經很久沒有寫算法題了&#xff0…

每日一題:leetcode989.數組形式的整數加法

題目描述 題目分析 題目非常簡單&#xff0c;但是我還是wa了幾發&#xff0c;對不起&#xff0c;我太菜了。我的想法是把K轉換為數組然后用大整數加法處理。但是因為太久沒有寫了導致寫了好久。 class Solution { public:void add(vector<int> &A, vector<int&g…

每日一題:leetcode674.最長連續遞增序列

題目描述 題目分析 一遍遍歷&#xff0c;如果硬要說用了什么算法的話覺得應該算是一個簡單的滑動窗口吧 AC代碼 class Solution { public:int findLengthOfLCIS(vector<int>& nums) {if (nums.size() 0) {return 0;}int ret 1;int cnt 1;for (int i 1; i <…

每日一題:leetcode959.由斜杠劃分區域

題目描述 題目分析 仔細分析這道題以后雖然覺得可能要轉化為圖之類的&#xff0c;但是完全沒有具體的想法&#xff0c;因為每個格子都有三種情況&#xff0c;這三種情況的不同的組合又會產生不同的結果。 發現找不到編碼轉化為圖以后&#xff0c;我分析了一下不同數量方塊之間…

每日一題:leetcode1319.聯通網絡的操作次數

題目描述 題目分析 ps&#xff1a;這篇博客是補前天的&#xff0c;前天在老家不方便寫博客 題目挺簡單的&#xff0c;但是通過題目對圖的連通性有了一個更深刻的認識&#xff1a;如果有超過&#xff08;或等于&#xff09;n-1條邊&#xff0c;則一定是可以讓整個圖聯通的。 如…

每日一題:leetcode1128.等價多米諾骨牌對數

題目描述 題目分析 看到題目以后第一個想法是遍歷數組&#xff0c;對每個元素有一個數據結構中保存了該元素出現的次數&#xff0c;然后往結果中相加&#xff08;表示該元素和前面的對數&#xff09;&#xff0c;然后再將元素出現的次數加一。 思考用什么數據結構保存元素出現…

每日一題:leetcode1579.保證圖可完全遍歷

題目描述 題目分析 非常慚愧&#xff0c;感覺自己有點畏難心理&#xff0c;看到是困難題第一個想法是自己想不出來。。。 因為自己認為自己做不出來&#xff0c;所以完全不能進行思考&#xff0c;稍微思考一下就覺得不行不行。 我也想到了分別用兩個并查集判斷各自可以去掉多少…

每日一題:leetcode724.尋找數組的中心索引

題目描述 題目分析 今天這道題原本很簡單&#xff0c;我都沒打算寫題解&#xff0c;當時用手機看的題目&#xff0c;我想著我三分鐘應該能寫出來&#xff0c;結果沒想到wa了三發。。。 對待簡單題不要輕視&#xff0c;對待難題不要畏難。 今天的主要問題是沒有看數據范圍&…

C++Primer學習筆記:第2章 變量和基本類型

空類型不對應具體的值&#xff0c;僅用于一些特殊的場合 long的長度為32位&#xff0c;float有&#xff17;個有效位&#xff0c;double有16個有效位 如果數值超過了int的范圍&#xff0c;應該用long long而不是long&#xff0c;long一般和int一樣大 在算術表達式中不要使用…

C++Primer學習筆記:第3章 字符串、向量和數組

可以使用using聲明而無需專門的前綴&#xff1a;using namespace::name;.。位于頭文件的代碼一般來說不應該使用using聲明&#xff0c;這是因為頭文件的內容會拷貝到所有引用他的文件中去&#xff0c;如果頭文件中有某個using聲明&#xff0c;那么每個使用了該頭文件的文件都會…

C++Primer學習筆記:第4章 表達式

表達式由一個或多個運算對象組成&#xff0c;對表達式求值將得到一個結果。字面值和變量是最簡單的表達式&#xff0c;其結果就是字面值和變量的值。把一個運算符和一個或多個運算對象組合起來可以生成較復雜的表達式。 重載運算符包括運算對象的類型和返回值的類型&#xff0…

C++Primer學習筆記:第5章 語句

一個表達式末尾加上分號就變成了表達式語句。最簡單的語句是空語句&#xff08;一個單獨的分號&#xff09;&#xff1a;語法上需要一條語句但是邏輯上不需要 復合語句是指用花括號括起來的&#xff08;可能為空&#xff09;語句和聲明的序列&#xff1a;用在語法上需要一條語…

z3 C++學習筆記

因為項目需要使用z3庫來解決問題&#xff0c;所以自己學習了一下&#xff0c;結果發現網上教程比較少&#xff0c;而且大部分都是使用Python&#xff0c;而我本人是C的忠實信徒&#xff0c;在知道C也可以使用z3庫以后我毫不猶豫地著手用C使用z3&#xff0c;但是我很快發現&…