反轉一個單鏈表。
示例:
輸入: 1->2->3->4->5->NULL 輸出: 5->4->3->2->1->NULL
進階:
你可以迭代或遞歸地反轉鏈表。你能否用兩種方法解決這道題?
思路
需要三個存放的位置 上一個 當前元素,下一個元素
package com.binglian.Linked;
/**
* 206時間複雜度:O(n)
* 空間複雜度:O(1)
* @author binglian
*
*/
public class LK_206 {
public class ListNode{
int val;
ListNode next;
ListNode(int x){
val=x;
}
}
public ListNode reverseList(ListNode head) {
ListNode pre=null;
ListNode cur=head;
while(cur !=null){
ListNode next=cur.next;
cur.next=pre;
pre=cur;
cur=next;
}
return pre;
}
}
使用遞歸的方法
package com.binglian.Linked;
import javax.management.BadAttributeValueExpException;
/**
* 遞歸的方式反轉
* 時間複雜度:O(n)
* 空間複雜度:O(n) 注意,遞歸是佔用空間的,佔用空間的大小和遞歸深度成正比
* @author binglian
*
*/
public class LK_206_2 {
public class ListNode{
int val;
ListNode next;
ListNode(int x){
val=x;
}
}
public ListNode reverseList(ListNode head) {
//遞歸終止條件
if(head==null || head.next==null)
return head;
ListNode rhead=reverseList(head.next);
//head->next此刻指向head後面的鏈表的尾節點
//head->next->next=head把head節點放在了尾部
head.next.next=head;
head.next=null;
return rhead;
}
}