題目:
定義乙個函式,輸入乙個鍊錶的頭節點,反轉該鍊錶並輸出反轉後鍊錶的頭節點。選值,next之後插到前面。示例:輸入: 1->2->3->4->5->null
輸出: 5->4->3->2->1->null
限制:0 <= 節點個數 <= 5000
public
class
listnode
}class
solution
listnode ans=
newlistnode
(head.val)
; head=head.next;
while
(head!=null)
return ans;
}}
改箭頭,將每個箭頭逆序
輸入: 1->2->3->4->5->null
輸出: 5->4->3->2->1->null
相當於輸入: 1->2->3->4->5->null
輸出: null<-1<-2<-3<-4<-5
意思也就是說,我們除了乙個乙個值都取出來之外,還可以直接在鍊錶上進行箭頭方向的修改,將它們指向反方向。
我們需要三個節點,乙個pre,乙個cur,乙個nex,分別代表前乙個,現在的,和後乙個。
nex=cur.next;
cur.next=pre;
pre=cur;
cur=nex;
完整**如下:
/**
* definition for singly-linked list.
* public class listnode
* }*/
class
solution
listnode pre=null;
listnode cur=head;
listnode nex=null;
while
(cur!=null)
return pre;
}}
類似與上面翻轉箭頭方向的方法。
遞迴的向下翻轉箭頭,直到找到最後乙個節點,然後開始翻轉,但是要保證 return 回來的是最後乙個節點。
/**
* definition for singly-linked list.
* public class listnode
* }*/
class
solution
listnode cur=
reverselist
(head.next)
; head.next.next=head;
head.next=null;
return cur;
}}
再來看這個**:
if
(head==null||head.next==null)
這個判斷的第乙個條件是判斷初始的鍊錶是否為空,第二個條件才是真正遞迴的判斷條件。
listnode cur=
reverselist
(head.next)
;
緊接上一步直接就遞迴呼叫了,可以看出這個遞迴的目的僅僅是找到倒數第二個節點,而已。
因為比如 1->2->3->4->5->null,遞迴進行到 4.next 傳入括號內,也就是 5 作為下一輪的 head,發現 5.next 為空,返回了 5,那麼 cur 就是 5.
head.next.next=head;
head.next=null;
return cur;
當從上一步返回後,進行了當前的 head 的操作,此時的 head 是 4,然後讓 5 指向了 4 ,完成了最後乙個箭頭的逆向;
然後將倒數第二個節點的 next 置空,防止環路產生;
然後return cur,也就是把最後乙個節點帶回去了。
注意,這一輪開始往前的每一輪,遞迴的返回值都變成了 cur =5 ,也就是最後乙個節點,因為上層的 if 條件都不滿足,那麼在最底層返回乙個節點之後,上層的每一層都進行乙個箭頭的逆序(箭頭逆序操作裡面和 cur 無關),然後把 cur 返回。
最後就達到了,逆序所有箭頭,然後返回了最後乙個節點的效果。
劍指offer 面試題24 反轉鍊錶
完整 位址 定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點 很簡單,單純考察 的魯棒性 要針對區分成以下三種情況處理 1.輸入的煉表頭指標為null 2.輸入的鍊錶只有乙個節點 3.輸入的鍊錶有多個節點 正常情況 public static class listnode pu...
劍指offer 面試題24 鍊錶反轉
題目 輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。思路 需要定義三個節點,當前節點pnode,前一節點ppre,和後一節點pnext。要將當前節點的下一節點pnode next用下一節點儲存起來,避免在反轉時發生鍊錶斷裂。然後將當前節點指向前一節點,然後將當前節點的指標移到下一節點,前一節點和下一...
《劍指offer 面試題24 反轉鍊錶》
劍指offer 面試題24 反轉鍊錶 註明 僅個人學習筆記 反轉鍊錶 public class reverselist24 鍊錶節點唯一時,返回頭節點 if head.next null node preversehead null node pnode head node prenode null...