1. 程式人生 > 其它 >每天一道演算法題系列二十三之反轉連結串列

每天一道演算法題系列二十三之反轉連結串列

技術標籤:連結串列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)
如果本篇內容有問題,請第一時間聯絡我,我會第一時間修改。
謝謝大家。