反轉鏈表

1.常見的鏈表反轉有兩種方案來解決,一種是經過迭代來修改指針,另外一種方案就是經過遞歸來實現,兩種算法的時間複雜度一致可是遞歸的空間複雜度更高
迭代
須要注意的是因爲是迭代,中間必然會有引用指向的修改,因此咱們就須要一個新的存儲變量來方便咱們後面進行指向修改node

ListNode prev=null;
        while(head!=null){
            ListNode node =head.next;
            head.next=prev;
            prev=head;
            head=node;
        }

遞歸
咱們須要考慮的是上層和下層的關係,而不是去考慮具體遞歸的值,同時由經驗可知,必定要考慮的兩個點就是臨界值的肯定和函數定義
以前k神的解法就很是好
函數定義中須要考慮的點:
入參、須要完成什麼、返回值算法

if(head.next==null){
            return head;
        }

        ListNode last=reverse(head.next);

        head.next.next=head;
        head.next=null;
        return last;

2.部分反轉
部分反轉的話須要考慮的問題:
1.須要一個虛擬頭節點dummyNode
2.須要一個節點pre,表明left以前的一個節點
3.先找到目標鏈表的頭節點left,而後經過right-left+1,找到目標鏈表的尾節點right
4.pre.next=null;right.next=null;
5.pre.next=right; left.next=curr;
3.究極體 k個一組來進行反轉
這個也有說法,以k個爲一組的時候,咱們能夠理解爲幾個區間,第一個就是已反轉區間,第二個就是待反轉區間,第三個就是未反轉區間,並且爲了方便咱們加入了虛擬頭節點(這是一個小細節,基本鏈表反轉都須要加這個)
1.首先明確咱們須要自定義四個變量,pre,next,start,end是兩兩對應的
2.若是最後的幾個不夠k個的話,那麼咱們就須要將最後一個區間拼接到以前的區間上
3.函數

ListNode start=pre;
ListNode next=end.next;
end.next=null;
pre.next=revese(start);
start.next=next;
pre=start;
end=prev;

上面這裏就是最核心的邏輯代碼
4.reverse(ListNode head)
這裏進行迭代的時候判斷條件應該是curr!=null指針

相關文章
相關標籤/搜索