本文參考自《劍指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
; 別忘記了。