轉載連結:https://blog.csdn.net/biqioso/article/details/82951283
一、單連結串列逆序
單連結串列逆序的三種方法(遞迴、直接翻轉指標、頭插)
下文程式碼中的list_head 結構體為連結串列節點結構體
1、遞迴方法
struct list_head *reverse(struct list_head *head) { struct list_head *new_head; /*判斷異常 || 結束判斷*/ if (!head || !head->next) /*邊界條件*/ return head; new_head = reverse(head->next);/*遞迴部分*/ head->next->next = head; /*溯回部分*/ head->next = NULL; /*記得要賦值為NULL,防止連結串列錯亂*/ return new_head; /*返回新的連結串列頭*/ }
2、直接翻轉指標
struct list_head *reverse(struct list_head *head) { struct list_head *prev = NULL; struct list_head *next; while (head != NULL) { next = head->next; head->next = prev; prev = head; head = next; } return prev; }
3、頭插法
struct list_head *reverse(struct list_head *head) { struct list_head *z, *save_next; save_next = head->next; /*j用來儲存下一個要翻轉的結點*/ head->next = NULL; /*這裡相當於把連結串列頭與連結串列的其餘\ 部分斷開,作為新的連結串列頭*/ while (save_next != NULL) { z = save_next; save_next = save_next->next; z->next = head->next; head->next = z; } return head; }
二、求連結串列的中間節點
轉自連結:https://blog.csdn.net/biqioso/article/details/83005096
求連結串列的中間節點(利用快慢指標)
①連結串列有奇數個節點時,中間節點只有一個;
②連結串列偶數個節點時,結果為輸出節點和它的下一個!
struct list_head *find_mid(struct list_head *head) { struct list_head *slow, *fast; slow = head; /*快慢指標都指向第一個節點*/ fast = head; while (fast != NULL && fast->next != NULL && fast->next->next != NULL) { slow = slow->next; /*慢指標每次走一步*/ fast = fast->next->next; /*快指標每次走兩步*/ } return slow; }
這是我的部落格,喜歡技術,喜歡頭腦風暴,歡迎交流
部落格園:https://www.cnblogs.com/live-passion/ CSDN部落格:https://blog.csdn.net/weixin_43960484