LeetCode——第206題:反轉連結串列
阿新 • • 發佈:2019-01-25
題目:
反轉一個單鏈表。
示例:
輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL
進階:
你可以迭代或遞迴地反轉連結串列。你能否用兩種方法解決這道題?
程式碼:
package leetCode;
import leetCode.Nineteen.ListNode;
/**
* 2018.7.23
* 反轉連結串列
* 思路1:感覺可以先掃描一遍連結串列將值存到一個數組,在迴圈陣列得出一個反轉連結串列
* 思路2:感覺可以在掃描的同時以從連結串列頭的方式插入結點完成連結串列反轉
* 進階思路:遞迴或迭代
* @author dhc
*
*/
public class TwoHundredAndSix {
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
//採用思路2(當用註釋的re是,是36ms,後來發現並不用這個re直接用head就行,直接0.5ms,有毒)
public static ListNode reverseList(ListNode head) {
if(head == null ) {
return null;
}
//ListNode re = head;
ListNode loopNode = head.next;
head.next = null;
while(loopNode != null) {
ListNode tem = head;
head = loopNode;
loopNode = loopNode.next;
head.next = tem;
}
return head;
}
//採用遞迴方法(大佬答案,不是很好理解的樣子)
public static ListNode reverseList1(ListNode head) {
if(head == null || head.next == null) {
return head;
}
ListNode sub = reverseList(head.next);
//讓後面一個結點指向前一個結點,遞迴的話是從最後一個結點開始,一直到最開始的結點
head.next.next = head;
//如果不只為空的話,head.next==head.next.next,而head.next.next=head,最後形成一個環
head.next = null;
return sub;
}
public static void main(String[] args) {
ListNode head = new TwoHundredAndSix().new ListNode(1);
ListNode node1 = new TwoHundredAndSix().new ListNode(2);
ListNode node2 = new TwoHundredAndSix().new ListNode(3);
ListNode node3 = new TwoHundredAndSix().new ListNode(4);
ListNode node4 = new TwoHundredAndSix().new ListNode(5);
head.next = node1;
node1.next = node2;
node2.next = node3;
node3.next = node4;
ListNode re = reverseList1(head);
while(re!=null) {
if(re.next == null) {
System.out.print(re.val);
}else {
System.out.print(re.val+"->");
}
re = re.next;
}
}
}