反轉鏈表——leetcode:92/206題
簡單篇
-
示例:
輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULLc++c++版web
/** * 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) { ListNode*new_head=NULL; while(head)//(當鏈表不爲空,即還有節點沒有反轉) { ListNode*next;// 作存儲 next=head->next;//(保存鏈表在該反向節點的後一個節點) head->next=new_head;//(鏈表反向,舊頭結點反) new_head=head;//(新頭節點後移到剛剛反轉的舊節點) head=next;//(舊頭結點移動到下一個須要反轉的節點) } return new_head; }
};svg
這個比較簡單,由於是直接把整個鏈表反轉,若是是把當中的某一段反轉呢?spa
升級篇
反轉從位置 m 到 n 的鏈表。請使用一趟掃描完成反轉。.net
說明:
1 ≤ m ≤ n ≤ 鏈表長度。code
示例:xml
輸入: 1->2->3->4->5->NULL, m = 2, n = 4
輸出: 1->4->3->2->5->NULLblog
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* reverseBetween(ListNode* head, int m, int n) { int list_len=n-m+1; ListNode *result=head; ListNode*pre_head=NULL; while(--m){ pre_head=head; head=head->next; } ListNode*N_L_last=head; ListNode*new_head=NULL; while(head&&list_len) { ListNode*next=head->next; head->next=new_head; new_head=head; head=next; list_len--; } N_L_last->next=head; if(pre_head) pre_head->next=new_head; else result=new_head; return result; } };
分析:從m到n,m可能爲1(從頭開始),n也可能爲鏈表長度(到最後)。
一,只須要注意四個關鍵節點(m-1, m , n , n+1 )其中m-1與n+1可能爲不存在的節點。
二,分爲兩部份處理問題(兩邊銜接處)
1),若是m=0,則 :result=new_head(直接爲反轉鏈表的首元節點)(pre_head此時 爲空,沒有與new _head創建關係)
若是m!=0, 則 :pre_head=new_head;(將m-1的節點與反轉後節點鏈接)
2)若是n!=表長,反轉後的最後一個節點(N_L_last)與n+1節點鏈接,而此時正好head指向該節點。
若是n=表長,反轉後的最後一個節點(N_L_last)的next應該爲空,而此時head也爲空,就不須要額外處理了。
三 ,最後返回處理完的頭結點。圖片
代碼不全,如須查看完整代碼,請登入力扣,查看完整版(題號已給出)
做者水平很菜,且是第一次寫,但願看完了別傷身體。leetcode
本文分享 CSDN - 希境。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。