(一)連結串列

Joker~燦發表於2021-03-03

 

轉載連結: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

相關文章