给定单链表的头节点 head
,请反转链表,并返回反转后的链表的头节点。
示例 1:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2] 输出:[2,1]
示例 3:
输入:head = [] 输出:[]
提示:
- 链表中节点的数目范围是
[0, 5000]
-5000 <= Node.val <= 5000
此题有两个思路可选:
思路一:去遍历链表,将每个节点的指针翻转:
先要判断链表是否为空,如果为空,直接返回NULL即可。
我们定义一个工作指针cur来指向某个节点,用prev来指向其上一个节点,然后便开始遍历链表。
在循环中,我们定义一个指针next来指向cur的下一个指针,然后进行翻转操作,将prev赋值给 cur->next,使cur指向的节点的指向翻转,然后在将cur赋值给prev,next赋值给cur,使他们开始迭代。
思路二:巧妙运用头插法,将原链表的节点头插到新的链表中:
首先定义一个newhead并赋值成NULL,用来当新的头指针,并定义一个工作指针cur来遍历原链表。然后开始循环来遍历链表。
我们再定义一个指针next用来存放cur指向节点的下一个节点,然后将newhead赋值给cur指向节点的next,再将cur赋值给newhead,将next赋值给cur,使其迭代起来。
// 题目2: 链表反转 --> 给你一个单链表头节点head,请你反转链表,并返回反转后的链表
struct ListNode* ReverseList(struct ListNode* head)
{
思路一: 遍历链表,翻转每个节点的指针指向
//if (head == NULL)
//{
// return NULL;
//}
//struct ListNode* prev = NULL, * cur = head;
//while (cur)
//{
// struct ListNode* next = cur->next;
// // 翻转
// cur->next = prev;
// prev = cur;
// cur = next;
//}
//return prev;
//思路二:头插法
// --> 取原链表中的节点,头查到newhead新链表中
struct ListNode* newhead = NULL;
struct ListNode* cur = head;
while (cur)
{
struct ListNode* next = cur->next;
cur->next = newhead;
newhead = cur;
cur = next;
}
return newhead;
}