> 文章列表 > 反转链表——C语言经典单链表题目

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

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

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

反转链表——力扣


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

 


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

/*** 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)。


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

首先:第一次翻转

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

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

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

 


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

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)