反轉鏈表問題

題目描述:
定義一個函數,輸入一個鏈表的頭節點,反轉該鏈表並輸出反轉後鏈表的頭節點。
 
示例:
輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL
來源:力扣(LeetCode)
解題思路
1.雙指針
1.用pre,cur兩個指針分別指向當前節點和前一個節點,初始化:pre=NULL,cur=head;每次都使cur指向pre
2.每次都使cur繼續日後遍歷,這裏由於cur->next發生了改變,應該提早設置一個指針temp=cur->next;pre指向cur便可;
3.直到cur=NULL;
(圖片來自於Leetcode)
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
         ListNode *pre=NULL,*cur=head;
         while(cur){
             ListNode *temp=cur->next;
             cur->next=pre;
             pre=cur;
             cur=temp;
         }
       return pre;  
    }
};

2.妖魔化的雙指針函數

1.這種方法實際上只用了一個額外指針cur,每次使得head的下一個節點指向cur;spa

2.cur同時向前移動,head指向改變指針

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if (head == NULL) { return NULL; }
        ListNode* cur = head;
        while (head->next != NULL) {
            ListNode* t = head->next->next;
            head->next->next = cur;                
            cur = head->next;           
            head->next = t;            //改變head的指向
        }
        return cur;
    }
};

 

 

3.遞歸解題code

1.特殊狀況,鏈表爲空或者長度爲1,此時能夠返回head;blog

2.鏈表長度大於1,則訪問到最後一個元素時開始依次有值迴歸;遞歸

3.每次使得指針的下一個節點指向該指針,並使得該指針指向NULL;圖片

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
         if(head==NULL||head->next==NULL)
         return head;  
         ListNode *ret= reverseList(head->next);
         head->next->next=head;
         head->next=NULL;
         return ret;
         }

};
相關文章
相關標籤/搜索