1. 程式人生 > >線性表總結(單鏈表的反轉)

線性表總結(單鏈表的反轉)

style 完成 null 意思 str 是什麽 left != comm

主要總結單鏈表反轉的幾種方法

第一種方法貌似是遞歸,不太懂,第二種方法使用三個指針逐一完成逆置

結構體定義:class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { //這步沒看懂,是結構體裏引用了自己嗎
        val = x;
        next = null;
    }
}
技術分享圖片
 1     // 1.就地反轉法
 2     public ListNode reverseList1(ListNode head) {
 3         if (head == null)
 4             return head;//判斷傳入的指針是否為空,為空則返回。
5 ListNode dummy = new ListNode(-1);//申請內存 6 dummy.next = head; 7 ListNode prev = dummy.next; 8 ListNode pCur = prev.next;//如圖所示 9 while (pCur != null) { 10 prev.next = pCur.next;//prev指針指向3 prev指向4   11 pCur.next = dummy.next;//pcur指針指向1 pcur指向2 
12 dummy.next = pCur;//dummy指針指向2  dummy指向3 13 pCur = prev.next;//pcur指向3 pcur指向4 14 }//一步一步看得懂,但是不明白總體的動態過程是怎樣的,一個個往後指怎麽完成逆置 15 return dummy.next; 16 }

總結:

  • 不明白結構體裏的引用是什麽意思
  • 不明白整個函數是如何動態完成逆置的


使用3個指針遍歷單鏈表,逐個鏈接點進行反轉。

  1. ActList* ReverseList2(ActList* head)
  2. {
  3. //ActList* temp=new ActList;
  4. if(NULL==head|| NULL==head->next) return head; //少於兩個結點則不反轉
  5. ActList* p;
  6. ActList* q;
  7. ActList* r;
  8. p = head;
  9. q = head->next;
  10. head->next = NULL;//使頭結點指向空
  11. while(q){
  12. r = q->next; //記錄第三個結點
  13. q->next = p; //將第二個結點指向第一個,完成逆置
  14. p = q;
  15. q = r; //三個結點同時後移
  16. }
  17. head=p;//使頭結點重新指向頭部
  18. return head;
  19. }

線性表總結(單鏈表的反轉)