【Java】 劍指offer(24) 反轉鏈表


本文參考自《劍指offer》一書,代碼采用Java語言。

更多:《劍指Offer》Java實現合集  

題目 

  定義一個函數,輸入一個鏈表的頭結點,反轉該鏈表並輸出反轉后鏈表的頭結點。

思路

  方法一:使用三個指針(pre,p,next)進行實現。令p指向pre,next則是用於防止鏈表斷裂(很簡單,詳見代碼)。

  方法二(遞歸):找到最后一個結點作為返回值,遞歸函數中,找到最后的頭結點后,開始進行每個結點next值的轉換。  

測試算例 

  1.功能測試(鏈表有多個或一個結點)

  2.特殊測試(頭結點為null)

Java代碼

新:

    //iteratively
    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;
    }
    //recursively
    public ListNode reverseList1(ListNode head) {
        if(head == null || head.next==null)
            return head;
        ListNode newHead = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return newHead;
    }

  

舊:

package _24;
/**
 * 
 * @Description 面試題24:反轉鏈表
 *
 * @author yongh
 * @date 2018年10月15日 下午3:24:51
 */

//題目:定義一個函數,輸入一個鏈表的頭結點,反轉該鏈表並輸出反轉后鏈表的
//頭結點。

public class ReverseList {
	public class ListNode {
		int val;
		ListNode next=null;
		ListNode(int val){
			this.val=val;			
		}
	}
	
	/*
	 * 三個指針實現
	 */
	public ListNode reverseList(ListNode head) {
		if(head==null)
			return null;
		ListNode pNode=head;
		ListNode preNode=null;
		ListNode nextNode=pNode.next;
		while(nextNode!=null) {
			pNode.next=preNode;
			preNode=pNode;
			pNode=nextNode;
			nextNode=pNode.next;
		}
		pNode.next=preNode;
		return pNode;
	}
	
	/*
	 * 遞歸實現
	 */
	public ListNode reverseList2(ListNode head) {
		if(head==null || head.next==null)
			return head;
		ListNode rvsHead=reverseList(head.next);
		//找到了最后的頭結點后,開始轉換每個結點的指向
		head.next.next=head;
		head.next=null;		
		return rvsHead;
	}
	
}

  

收獲

  1.與鏈表相關的題目總是涉及大量指針操作,以后遇到鏈表相關的題目時,多考慮指針的使用。

  2.遞歸實現時,第50行:head.next=null; 別忘記了。

  

更多:《劍指Offer》Java實現合集  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM