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

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

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

題目 

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

思路

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

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

測試算例 this

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

  2.特殊測試(頭結點爲null)指針

Java代碼

新:code

//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;
    }

  

舊:htm

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實現合集 

相關文章
相關標籤/搜索