1. 程式人生 > >LeetCode 206——反轉連結串列

LeetCode 206——反轉連結串列

對單鏈表進行反轉有迭代法和遞迴法兩種。

1. 迭代法

  • 迭代法從前往後遍歷連結串列,定義三個指標分別指向相鄰的三個結點,反轉前兩個結點,即讓第二個結點指向第一個結點。然後依次往後移動指標,直到第二個結點為空結束,再處理連結串列頭尾即可。

1.png

2.png

3.png

4.png

5.png

/**
 * 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) { if (head == NULL || head->next == NULL) // 空鏈或只有一個結點,直接返回頭指標 { return head; } else // 至少有兩個結點 { ListNode * p1 = head;
// 第一個結點 ListNode * p2 = p1->next; // 第二個結點 ListNode * p3 = p2->next; // 第三個結點 while (p2) // 第二個結點為空,到鏈尾,結束 { p3 = p2->next; p2->next = p1;
// 第二個結點指向第一個結點,進行反轉 p1 = p2; // 第一個結點往後移 p2 = p3; // 第二個結點往後移 } head->next = NULL; // 第一個結點也就是反轉後的最後一個節點指向 NULL head = p1; // 頭結點指向反轉後的第一個節點 return head; } } };

2. 遞迴法

  • 基線條件:空鏈或只有一個結點,直接返回頭指標
  • 遞迴條件:遞迴呼叫,返回子連結串列反轉後的頭指標

6.png

7.png

8.png

9.png

Solution {
public:
    ListNode* reverseList(ListNode* head) {
    
        if (head == NULL || head->next == NULL)     // 空鏈或只有一個結點,直接返回頭指標
        {
            return head;            
        }

        else                                        // 有兩個以上結點
        {
            ListNode *new_head = reverseList(head->next); // 反轉以第二個結點為頭的子連結串列
            
            // head->next 此時指向子連結串列的最後一個結點
            
            // 將之前的頭結點放入子鏈尾
            head->next->next = head;
            head->next = NULL;
            
            return new_head;
        }
    }
};

獲取更多精彩,請關注「seniusen」! seniusen