問題描述
定義一個函數,輸入一個鏈表的頭結點,反轉該鏈表並輸出反轉後的鏈表的頭結點。鏈表結點如下:
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
思路1:
要想反轉鏈表,對於結點i,我們要把它的next指向它的前趨,因此我們需要保存前趨結點,同時,如果我們已經把i的next重新賦值,會無法找到i的後繼,因此,在重新賦值之前,我們要保存i的後繼。
代碼:
public ListNode ReverseList(ListNode head) {
if(head == null){
return null;
}
ListNode rHead = null;
ListNode prior = null;//store prior
ListNode q = head;//store current
while(q != null){
ListNode next = q.next;//store the next
if(next == null){
rHead = q;
}
q.next = prior;
prior = q;
q = next;
}
return rHead;
}
思路2:
使用遞歸的思想(暫時沒有想到,因爲如果用遞歸的話,每次應該是:鏈表的第一個結點<—遞歸返回的鏈表的尾指針,但是這樣的話就無法獲得反轉後的頭指針了。)後面再思考吧。