Every day a leetcode
题目来源:206. 反转链表
解法1:带头节点的头插法就地逆置
将头节点摘下,然后从第一个节点开始,依次插入到头节点的后面,直到最后一个节点为止,这样就实现了链表的逆置。
完成后是一个循环单链表。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
struct ListNode* L=malloc(sizeof(struct ListNode));
L->next=head;
struct ListNode* p=L->next;
struct ListNode* r;
L->next=NULL;
while(p)
{
r=p->next;
p->next=L->next;
L->next=p;
p=r;
}
return L->next;
}
结果:

时间复杂度:O(n)
空间复杂度:O(1)
解法2:不带头节点的就地逆置
定义两个指针: pre 和 cur 。
pre 在前 cur 在后。
每次让 pre->next 指向 cur ,实现一次局部反转。
局部反转完成之后,pre 和 cur 同时往前移动一个位置。(这里需要一个p记录pre->next)
循环上述过程,直至 pre 到达链表尾部。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
struct ListNode* cur=NULL;
struct ListNode* pre=head;
while(pre)
{
struct ListNode* p=pre->next;
pre->next=cur;
cur=pre;
pre=p;
}
return cur;
}
结果:

时间复杂度:O(n)
空间复杂度:O(1)
解法3:递归

代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
if(head == NULL || head->next == NULL) return head;
struct ListNode* L=reverseList(head->next);
head->next->next=head;
head->next=NULL;
return L;
}
结果:

时间复杂度:O(n)
空间复杂度:O(n)
本文详细介绍了三种解决LeetCode 206题(反转链表)的方法:头节点带头插法、不带头节点指针交换以及递归实现。每种方法的时间和空间复杂度都被详细分析。
1202

被折叠的 条评论
为什么被折叠?



