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