每天一道演算法題系列二十三之反轉連結串列
阿新 • • 發佈:2020-12-23
技術標籤:連結串列dfs雙指標連結串列指標leetcodejava
每天一道演算法題系列:
來源:力扣(LeetCode)
本題連結:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/
來源是力扣,大家喜歡可以去力扣中文網做相應的其他的題,某瀏覽器直接搜力扣即可。
本題難度是簡單
定義一個函式,輸入一個連結串列的頭節點,反轉該連結串列並輸出反轉後連結串列的頭節點。
示例:
輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
/*
這是雙指標的模式
每次讓 pre 的 nextnext 指向 curcur ,實現一次區域性反轉
區域性反轉完成之後, prepre 和 curcur 同時往前移動一個位置
迴圈上述過程,直至 prepre 到達連結串列尾部
*/
class Solution {
public ListNode reverseList(ListNode head) {
// 定義兩個指標: pre 和 cur
ListNode pre = null ;
ListNode cur = null ;
ListNode tmp = head ;
//當tmp不為空
while(tmp != null ){
//先把tmp的值給pre 比如連結串列為1->2->3->4->5
//那麼這個時候pre等於2->3->4->5
pre = tmp.next ;
//把null賦值給tmp.next 那麼tmp就等於1
tmp.next = cur ;
//把1賦值給cur
cur = tmp ;
//把2->3->4->5賦值給tmp繼續進行while迴圈
tmp = pre ;
}
return cur;
}
}
附上大神的遞迴的解法
class Solution {
public ListNode reverseList(ListNode head) {
return recur(head, null); // 呼叫遞歸併返回
}
private ListNode recur(ListNode cur, ListNode pre) {
if (cur == null) return pre; // 終止條件
ListNode res = recur(cur.next, cur); // 遞迴後繼節點
cur.next = pre; // 修改節點引用指向
return res; // 返回反轉連結串列的頭節點
}
}
遞迴演算法
public Node reverseList(Node head) {
//遞迴終止條件是當前為空,或者下一個節點為空
if(head==null || head.next==null) {
return head;
}
//這裡的cur就是最後一個節點
Node cur = reverseList(head.next);
//這裡請配合動畫演示理解
//如果連結串列是 1->2->3->4->5,那麼此時的cur就是5
//而head是4,head的下一個是5,下下一個是空
//所以head.next.next 就是5->4
head.next.next = head;
//防止連結串列迴圈,需要將head.next設定為空
head.next = null;
//每層遞迴函式都返回cur,也就是最後一個節點
return cur;
}
```
上一篇文章:[每天一道演算法題系列二十三之合併K個升序連結串列](https://blog.csdn.net/qq_38091343/article/details/111307876)
如果本篇內容有問題,請第一時間聯絡我,我會第一時間修改。
謝謝大家。