線性表總結(單鏈表的反轉)
阿新 • • 發佈:2019-03-25
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指向212 dummy.next = pCur;//dummy指針指向2 dummy指向3 13 pCur = prev.next;//pcur指向3 pcur指向4 14 }//一步一步看得懂,但是不明白總體的動態過程是怎樣的,一個個往後指怎麽完成逆置 15 return dummy.next; 16 }
總結:
- 不明白結構體裏的引用是什麽意思
- 不明白整個函數是如何動態完成逆置的
使用3個指針遍歷單鏈表,逐個鏈接點進行反轉。
- ActList* ReverseList2(ActList* head)
- {
- //ActList* temp=new ActList;
- if(NULL==head|| NULL==head->next) return head; //少於兩個結點則不反轉
- ActList* p;
- ActList* q;
- ActList* r;
- p = head;
- q = head->next;
- head->next = NULL;//使頭結點指向空
- while(q){
- r = q->next; //記錄第三個結點
- q->next = p; //將第二個結點指向第一個,完成逆置
- p = q;
- q = r; //三個結點同時後移
- }
- head=p;//使頭結點重新指向頭部
- return head;
- }
線性表總結(單鏈表的反轉)