leetcode刷刷題(28) ---- 反轉鏈表(C語言版)

2020-2-10

  • Don’t forget, a person’s greatest emotional need is to feel appreciated.
    莫忘記,人類情感上最大的需要是感恩。

題目

反轉一個單鏈表。

示例:

輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL
進階:
你可以迭代或遞歸地反轉鏈表。你能否用兩種方法解決這道題?

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/reverse-linked-list
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

個人解答:(C版本)

  • 一開始就想到了迭代的方法,通過切換指針的指向,完成反轉鏈表。
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

struct ListNode* reverseList(struct ListNode* head){
    struct ListNode* q=NULL;
    struct ListNode* p=NULL;
    struct ListNode* t=NULL;

    if(head==NULL)
    {
        return head;
    }

    if(head->next==NULL)
    {
        return head;
    }

    q = head;  
    p = q->next;
    t = p->next; // 用於記錄後面的位置

    q->next = NULL;
    p->next = q;

    while(t != NULL)
    {
        // 不斷迭代
        q = p;
        p = t;
        t = t->next;
        p->next = q; // 反轉指針的指向
    }
    return p;
}
  • 結果:
    在這裏插入圖片描述
他山之石:
  • 參考了官方題解,其中遞歸的方法真的很精妙,不過理解起來也很複雜,自己使用C語言實現了的遞歸算法如下:
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

struct ListNode* reverseList(struct ListNode* head){

    if (head == NULL || head->next == NULL) 
        return head;

    struct ListNode* p = reverseList(head->next);
    head->next->next = head;
    head->next = NULL;
    return p;
}

在這裏插入圖片描述

發佈了251 篇原創文章 · 獲贊 168 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章