题目介绍
题目:
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
// Definition for singly-linked list.
struct ListNode
{
int val;
struct ListNode *next;
};
示例1:
输出:head = [1,2,3,4,5]
输出:[5,4,3,2,1]示例2:
输入:head = [1,2]
输出:[2,1]示例3
输入:head = []
输出:[]
leetcode链接:
反转链表
思路介绍
对于以下链表
我们会希望他变成以下链表:
以下是动图
我们需要定义三个指针,以上图中的第一个节点(val == 1)为例
1.首先需定义
cur = head;
rhead = NULL;
next = head->next
2.令
cur
指向rhead
cur->next = rhead;
(此时val == 1
的节点就指向了NULL
)3.让这三个指针依次向后走
rhead = cur;
cur = curnext;
curnext = curnext->next;
(改变了cur
的next
后,需要curnext
保存val == 2
的节点)
截止条件可以从动图中得到:curnext == NULL
,在此时,链表的最后一个节点还指向NULL
,在循环结束后,还需使最后一个节点指向上一个节点,即cur = rhead;
,此时cur
指向的就是反转链表的头节点
代码展示
struct ListNode* reverseList(struct ListNode* head)
{
//对应示例3
if (head == NULL)
{
return NULL;
}
struct ListNode* cur = head;
struct ListNode* rhead = NULL;
struct ListNode* curnext = head->next;
while (curnext != NULL)
{
// 使cur指向rhead
cur->next = rhead;
// 改变三个指针的位置
rhead = cur;
cur = curnext;
curnext = curnext->next;
}
cur->next = rhead;
return cur;
}