力扣—206. 反轉鏈表

反轉一個單鏈表。

示例:

輸入: 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;
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章