题目
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例
思路
# 1.数组替换
我们定义一个数组,从头开始遍历链表,将链表的值保存到数组中,从头开始保存,然后再从头开始遍历链表,将数组的值赋值给链表,这次数组我们从尾开始遍历,这样子从形式上来说,我们也对链表完成了反转
# 2.迭代
链表问题大都都可以运用双指针思路,我们定义两个指针,一个走在前面,一个走在后面,每走一步就让前面的指针指向后面,最后走完就完成了反转,只不过其中得注意,需要申请一个临时变量保存一下快指针的下一步,不然就走丢了
# 3.递归
递归我们值需要搞明白一个
head->next->next = head;
head->next = NULL;
这个两个语句,仔细捋一下,就会发现,这个就完成了两个节点之间的反转,然后我们递归到最后一个节点,并且将其保存为新的头结点,从最后一个节点开始反转节点,就可以完成反转链表
代码
# 1.数组替换
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/*
struct ListNode* reverseList(struct ListNode* head)
*struct ListNode* reverseList:将链表反转
struct ListNode* head:未被反转的头结点
返回值:反转之后的头节点
*/
struct ListNode* reverseList(struct ListNode* head){
if(!head)
{
return NULL;
}
int ans[5001];
int i, m = 0;
struct ListNode * l = head;
while(l)
{
ans[m++] = l->val;
l = l->next;
}
l = head;
while(l)
{
l->val = ans[--m];
l = l->next;
}
return head;
}
# 2.迭代
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/*
struct ListNode* reverseList(struct ListNode* head)
*struct ListNode* reverseList:将链表反转
struct ListNode* head:未被反转的头结点
返回值:反转之后的头节点
*/
struct ListNode* reverseList(struct ListNode* head){
if(!head)
{
return NULL;
}
struct ListNode * cus = head;
struct ListNode * p = NULL;
while(cus)
{
struct ListNode * n = cus->next;
cus->next = p;
p = cus;
cus = n;
}
return p;
}
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/*
struct ListNode* reverseList(struct ListNode* head)
*struct ListNode* reverseList:将链表反转
struct ListNode* head:未被反转的头结点
返回值:反转之后的头节点
*/
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;
}