反轉連結串列(C++簡單區)

M-DoubleC發表於2020-09-25

反轉連結串列

題目:定義一個函式,輸入一個連結串列的頭節點,反轉該連結串列並輸出反轉後連結串列的頭節點。

示例:
輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL

限制:
0 <= 節點個數 <= 5000


解題思路

解法一(雙連結串列法)

演算法過程
在這裡插入圖片描述

在這裡插入圖片描述
程式碼如下:

/**
 * 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) {
        //p是新連結串列
        ListNode* p=NULL;
        ListNode* q=NULL;
        while(head)
        {
            //q用作儲存下一節點
            q=head->next;
            head->next=p;
            //更新新連結串列
            p=head;
            head=q;
        }
        return p;
    }
};

連結:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/solution/3chong-jie-jue-fang-shi-zhan-shuang-lian-biao-di-g/


解法二(雙指標法)

演算法過程

  1. 定義兩個指標:pre和 cur;pre在前cur在後。
  2. 每次讓pre的 next指向 cur,實現一次區域性反轉
  3. 區域性反轉完成之後, pre 和 cur 同時往前移動一個位置
  4. 迴圈上述過程,直至 pre 到達連結串列尾部
    在這裡插入圖片描述
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* cur = NULL, *pre = head;
        while (pre != NULL) {
            ListNode* t = pre->next;
            pre->next = cur;
            cur = pre;
            pre = t;
        }
        return cur;
    }
};

連結:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/solution/fan-zhuan-lian-biao-yi-dong-de-shuang-zhi-zhen-jia/

相關文章