反转链表——C语言经典单链表题目

首先,把oj题目的链接放在这,大家可以先去练习一下,再来看解析。

反转链表——力扣


题目:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

反转链表——C语言经典单链表题目_第1张图片

 


现在让我们来看一下解决代码,先看一下我写的代码。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* reverseList(struct ListNode* head){

    struct ListNode* tmp = NULL;//一个新的链表,来存储翻转时的链表。
    struct ListNode* newhead = head;//一般我们都会创建一个新的指针来指向链表。
    while(newhead)
    {
        struct ListNode* nexthead = newhead->next;//让nexthead指向下一个节点。
        newhead->next = tmp;//让下一个节点等于tmp,第一次相当于将第一个节点的next=NULL,第二次以后就相当于将newhead->next链接到翻转后的链表,然后依次链接。
        tmp = newhead;//让tmp来接收翻转后的链表
        newhead = nexthead;//再让newhead进行下一个节点的翻转。
    }
    return tmp;
}

        这是一种依次翻转,然后链接的方法。

        其空间复杂度是:O(1);

            时间复杂度是:O(N)。


现在让我们来看一下它的详细讲解,其实我在代码旁边的注释已经十分清楚了,但是让我们来看一下图,可以更清晰的理解它。 

首先:第一次翻转

反转链表——C语言经典单链表题目_第2张图片

这个时候tmp的具体指向就是:1-NULL。

 然后,就是不断的翻转,存储,最后返回。

反转链表——C语言经典单链表题目_第3张图片

 后面就是不断的重复这个过程。

 


当然它还有其他的方法,具体的可以看力扣或者其他的讲解,我这边就放一下代码。

struct ListNode* reverseList(struct ListNode* head) {
    if (head == NULL || head->next == NULL) {
        return head;
    }
    struct ListNode* newHead = reverseList(head->next);
    head->next->next = head;
    head->next = NULL;
    return newHead;
}

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/reverse-linked-list/solution/fan-zhuan-lian-biao-by-leetcode-solution-d1k2/
来源:力扣(LeetCode)

你可能感兴趣的:(链表,c语言,数据结构)