摘要:示例輸入輸出進(jìn)階你可以迭代或遞歸地反轉(zhuǎn)鏈表。可以設(shè)置一個指針,指向,保證后續(xù)的操作然后將,往前挪動,當(dāng)然還有,直到為空,這時指向反轉(zhuǎn)后鏈表的頭結(jié)點(diǎn)。接下來考慮遞歸結(jié)束的條件非常顯然,子鏈表只有一個節(jié)點(diǎn)是遞歸結(jié)束,直接返回該節(jié)點(diǎn)。
本文來自 SoulOH 的CSDN 博客 ,原文地址請點(diǎn)擊:https://blog.csdn.net/SoulOH/...
題目:
反轉(zhuǎn)一個單鏈表。
示例:
輸入: 1->2->3->4->5->NULL 輸出: 5->4->3->2->1->NULL
進(jìn)階:
你可以迭代或遞歸地反轉(zhuǎn)鏈表。你能否用兩種方法解決這道題?
解答:
迭代方式:首先判斷鏈表是不是空的,如果是空的,直接返回null;
對于鏈表:
放兩個指針p1, p2:
不能直接將p2 -> next指向p1,否則鏈表會斷掉。
可以設(shè)置一個tmp指針,指向 p2 -> next,保證后續(xù)的操作:
然后將p1,p2往前挪動,當(dāng)然還有tmp,直到p2為空,這時p1指向反轉(zhuǎn)后鏈表的頭結(jié)點(diǎn)。
最后一次:
剛好結(jié)束的時候:
完成了?
不。好像有一點(diǎn)不對勁兒,還多了一個1 -> 2的指針,少了一個null(1 -> null)。正巧head還在,通過head -> next訪問多余的指針,指向null(其實(shí)一開始就可以這么干的。)
實(shí)現(xiàn)代碼:
/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ /** * @param {ListNode} head * @return {ListNode} */ var reverseList = function(head) { //迭代 if (head == null || head.next == null) return head; var p1 = head; var p2 = head.next; p1.next = null; while (p2 !== null) { var temp = p2.next; p2.next = p1; p1 = p2; p2 = temp; } return p1; };遞歸方式:
我們可以從另一個角度考慮這件事:
同樣地,對于這樣一個鏈表:
我們要反轉(zhuǎn)它,其實(shí)可以
然后我們當(dāng)作這個子鏈表已經(jīng)反轉(zhuǎn)完成:
而我們需要的是:
于是我們可以將上上張圖的head.next.next = head:像是這樣:
然而僅僅這樣是不夠的,鏈表到現(xiàn)在有一個明顯的環(huán),我們要把這個環(huán)去掉:
令head.next = null即可。
完成。
接下來考慮遞歸結(jié)束的條件:非常顯然,子鏈表只有一個節(jié)點(diǎn)是遞歸結(jié)束,直接返回該節(jié)點(diǎn)。
當(dāng)然,這個可以和一開始的空值處理(空鏈表的處理)寫到一起。
下面是具體實(shí)現(xiàn):
/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ /** * @param {ListNode} head * @return {ListNode} */ var reverseList = function(head) { //遞歸 if (head == null || head.next == null) return head; var res = reverseList(head.next); head.next.next = head; head.next = null; return res; };
本文來自 SoulOH 的CSDN 博客 ,原文地址請點(diǎn)擊:https://blog.csdn.net/SoulOH/...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/97989.html
摘要:算法思路兩種方法一般反轉(zhuǎn)遞歸法一般解決定義三個指針,分別為,存儲當(dāng)前結(jié)點(diǎn),指向反轉(zhuǎn)好的結(jié)點(diǎn)的頭結(jié)點(diǎn),存儲下一結(jié)點(diǎn)信息。遞歸法重點(diǎn)分析先確定終止條件當(dāng)下一結(jié)點(diǎn)為時,返回當(dāng)前節(jié)點(diǎn)判斷當(dāng)前的鏈表是否為遞歸找到尾結(jié)點(diǎn),將其存儲為頭結(jié)點(diǎn)。 Time:2019/4/23Title: Reverse Linked ListDifficulty: EasyAuthor: 小鹿 題目:Reverse...
摘要:反轉(zhuǎn)一個單鏈表。示例輸入輸出進(jìn)階你可以迭代或遞歸地反轉(zhuǎn)鏈表。你能否用兩種方法解決這道題解題思路每次遍歷到最后一位取節(jié)點(diǎn)這種方法就算了時間復(fù)雜度太高。從鏈表末尾向頭部逐個分離節(jié)點(diǎn),并將節(jié)點(diǎn)添加到新鏈表的末尾。與迭代法原理相似。 反轉(zhuǎn)一個單鏈表。 Reverse a singly linked list. 示例: 輸入: 1->2->3->4->5->NULL 輸出: 5->4->3->2...
摘要:反轉(zhuǎn)一個單鏈表。示例輸入輸出進(jìn)階你可以迭代或遞歸地反轉(zhuǎn)鏈表。你能否用兩種方法解決這道題解題思路每次遍歷到最后一位取節(jié)點(diǎn)這種方法就算了時間復(fù)雜度太高。從鏈表末尾向頭部逐個分離節(jié)點(diǎn),并將節(jié)點(diǎn)添加到新鏈表的末尾。與迭代法原理相似。 反轉(zhuǎn)一個單鏈表。 Reverse a singly linked list. 示例: 輸入: 1->2->3->4->5->NULL 輸出: 5->4->3->2...
摘要:給定一個鏈表,旋轉(zhuǎn)鏈表,將鏈表每個節(jié)點(diǎn)向右移動個位置,其中是非負(fù)數(shù)。按上述思路解,與旋轉(zhuǎn)數(shù)組那道題大同小異,來介紹另一種很簡單高效的方法。只需在第個節(jié)點(diǎn)之后切斷,首尾連接即可。另外可能大于鏈表長度,應(yīng)當(dāng)做求余運(yùn)算。 ?給定一個鏈表,旋轉(zhuǎn)鏈表,將鏈表每個節(jié)點(diǎn)向右移動 k 個位置,其中 k 是非負(fù)數(shù)。 Given a linked list, rotate the list to the ...
閱讀 3393·2023-04-25 22:47
閱讀 3894·2021-10-11 10:59
閱讀 2368·2021-09-07 10:12
閱讀 4355·2021-08-11 11:15
閱讀 3496·2019-08-30 13:15
閱讀 1813·2019-08-30 13:00
閱讀 1032·2019-08-29 14:02
閱讀 1745·2019-08-26 13:57