題目描述:定義一個函數,輸入一個鏈表的頭節點,反轉該鏈表並輸出反轉後鏈表的頭節點。示例:輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->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; } };