題解 | #反轉(zhuǎn)鏈表01#
反轉(zhuǎn)鏈表
http://www.fangfengwang8.cn/practice/75e878df47f24fdc9dc3e400ec6058ca
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { public ListNode ReverseList(ListNode head) { //利用輔助結(jié)點 ListNode cur = head; ListNode next = null;//保存cur的下一個節(jié)點 ListNode rehead = new ListNode(0);//新的頭節(jié)點 //判斷原鏈表是否為空 或者只有一個節(jié)點 //但由于head可能為空 所以會出現(xiàn)空指針異常 if(cur != null){ if(cur.next==null){ return head; } } //利用循環(huán) while (cur !=null){ next = cur.next;//下一節(jié)點進行保存 //cur當前節(jié)點后所有節(jié)點更換成0節(jié)點后所有節(jié)點 cur.next = rehead.next; //把包含cur當前節(jié)點的鏈表轉(zhuǎn)移到0節(jié)點后,永遠讓cur的最新節(jié)點為0節(jié)點后一位 rehead.next =cur; //往后推移,cur當前節(jié)點更新到下一個節(jié)點 cur = next; } //將rehead后的節(jié)點 掛到 head后面 實現(xiàn)head整個鏈表的反轉(zhuǎn) head = rehead.next; return head; } }
LC上面的解法 但感覺太麻煩了 也不好理解 原理就是雙鏈表
雙鏈表求解是把原鏈表的結(jié)點一個個摘掉,每次摘掉的鏈表都讓他成為新的鏈表的頭結(jié)點,然后更新新鏈表
cur是原鏈表 next臨時鏈表 rehead是轉(zhuǎn)移鏈表
要保持rehead的null節(jié)點一直在第一個 就比較費解