給定一個單向鏈表的頭結點,要求將鏈表反轉,並返回新的頭結點。
一、迭代實現
思路:遍歷鏈表,依次調整每個節點的指針域。
定義 結點p指向當前節點
結點q指向當前節點的下一個結點(p->next非空時)
結點r指向當前節點的前一個結點
節點newhead指向新頭結點()
初始 p=head,q=NULL,r = NULL;
當p不為空時:
如果p->next非空 q = p->next
p->next = r
r = p
p = q
最后r即為反轉后鏈表的新頭結點!
代碼實現:
Listnode * ReverseList(Listnode *head){ if(head->next == NULL) return head; Listnode *p,*q,*r; p=head;q=r=NULL; while(p!=NULL){ //if(p->next!=NULL) q = p->next; p->next = r; r = p; p = q; } return r; }
二、遞歸實現
迭代法實現是順序遍歷從頭到尾改變指針指向,遞歸的特性是回溯,采用從后向前改變指針指向的方式來實現鏈表反轉。
ListNode* reverse(ListNode* H) { //包括特殊情況 if (H == NULL || H->next == NULL) return H; ListNode *newH = reverse(H->next);//注意,此處的操作是一直循環到鏈表末尾 H->next->next = H;//反轉每個節點的指向 H->next = NULL; return newH; }
參考: