首先看題目:反轉乙個單鏈表。
示例:
高階:你可以迭代或遞迴地反轉鍊錶。你能否用兩種方法解決這道題?輸入:1-
>2-
>3-
>4-
>5-
>null
輸出:5
->4-
>3-
>2-
>1-
>null
先不管什麼高階,不管黑貓白貓,只要能抓到耗子就是好貓。我們就是用最笨的方法也得把這道題給解決嘍。
解決思路:
首先明白我們要幹啥,反轉鍊錶。最簡單的方法是啥?就是把鍊錶遍歷一遍,取出所有的值,然後再反著給他拼回去不就行了。
實踐**:
首先加入題目中給的 listnode 類
然後我們開始我們的解題之旅:package com.gyx.util;
/** * 節點類
* @author geyuxuan 2020/02/29 17:09
*/public
class
listnode
}
取出所有鍊錶節點值。
放入乙個list中儲存。
反向迴圈拼接鍊錶節點。
**實現如下:
然後我們測試一下:/**
* 反轉鍊錶 - 不用腦子的解法
* @param head
* @author geyuxuan 2020-03-02 22:08:57
* @return com.gyx.util.listnode
*/public listnode reverselist
(listnode head)
//反向迴圈拼接鍊錶
for(
int i =
0;i < list.
size()
; i++
)return pre.next;
}
列印結果:5 4 3 2 1package com.gyx.util;
/** * description
* @author geyuxuan 2020/02/29 17:35
*/public
class
test
}}
ok,這就是我們最笨的解法了。這種解法太笨了,有點暴力破解的意思。
所以現在我們來看看高階的迭代解法。
迭代的意思就是不斷迴圈呼叫相同的**,但是每一次的初始值使用上一次的結果。
其實我們昨天兩數相加的題目裡面也用到了迭代,在鍊錶中迴圈取值並列印出來,這就算乙個簡單的迭代了。
我們現在來考慮反轉鍊錶迭代的思路:
需要儲存下乙個節點,保證能迴圈當前鍊錶。
將當前節點的next節點換成上乙個節點。(反轉)
移動pre指標將當前節點變成下乙個節點的下乙個節點。
將儲存的下乙個節點賦給當前節點,迭代下乙個鍊錶節點。
其實迭代的解題方法我也說的不是很清楚怎麼完成反轉的。這周週末會補上一張自己畫的gif**,這樣不僅可以幫助大家,也可以幫助我自己更好的理解迭代演算法。/**
* 反轉鍊錶 - 迭代
* @param head
* @author geyuxuan 2020-03-02 22:08:57
* @return com.gyx.util.listnode
*/public listnode reverselist1
(listnode head)
return pre;
}
遞迴演算法就更不用說了,感覺腦子不夠用了,這周週末一起補上詳解;一定得啃下它。
未完待續:
迭代演算法gif**。
遞迴演算法詳解。
不忘初心,砥礪前行。
資料結構之鍊錶反轉
鍊錶分為單向鍊錶和雙向鍊錶,無論是哪一種鍊錶,反轉都是類似的,區別主要是雙向將當前節點的last節點指向next節點。鍊錶反轉要注意的就是找到當前節點時,在進行反轉前,找到當前節點的上乙個節點和下乙個節點,這樣才能保證每一次的反轉後可以移動到下乙個節點並繼續進行操作。public class nod...
資料結構264 反轉鍊錶
輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。輸入第一行為整數n n 1 代表測試鍊錶數。從第二行開始每行表示乙個鍊錶,其中第乙個資料表示鍊錶中資料個數,其餘資料表示要測試的鍊錶中的資料,均為整數。每一行對應乙個鍊錶反轉後的元素。35 1 2 3 4 5 3 2 4 5 1 35 4 3 2 1 5...
Java資料結構之鍊錶反轉
思路很簡單,定義乙個類,這個類分成2塊,一塊是表示自身的標誌,另外乙個儲存指向下乙個元素的引用。通過互換相鄰兩個節點的引用來達到鍊錶反轉的效果。上 package com.withiter.test public class reverselist public static node add st...