首页 > 其他分享 >LeetCode刷题(1)【链表】【反转链表】(C语言)

LeetCode刷题(1)【链表】【反转链表】(C语言)

时间:2022-11-17 21:42:01浏览次数:52  
标签:NULL ListNode struct next 链表 n1 n2 C语言 LeetCode



我的小站——半生瓜のblog (doraemon2.xyz)

题目链接——206. 反转链表 - 力扣(LeetCode) (leetcode-cn.com)


反转链表

思路一:反转指针

LeetCode刷题(1)【链表】【反转链表】(C语言)_链表

LeetCode刷题(1)【链表】【反转链表】(C语言)_两个指针_02


本质上就是调转指针的方向。

首先我们定义两个指针,一个叫n1,一个叫n2。(Node1,Node2)

让n2指向第一个结点,让n1指向空。

LeetCode刷题(1)【链表】【反转链表】(C语言)_两个指针_03


n2->next指向n1。

LeetCode刷题(1)【链表】【反转链表】(C语言)_结点_04


但是,两个指针是反不转的。因为:

这里让n2->next指向n1,就是把n1的值存到n2的next上,n2->next原来存的是2的地址,现在存的是NULL,但是继续往后走的时候,我们发现找不到2了 。

所以要反转指针,两个指针是反不动的,要用3个。

前两个指针 反转,最后一个指针负责记录下一个位置。

LeetCode刷题(1)【链表】【反转链表】(C语言)_两个指针_05


LeetCode刷题(1)【链表】【反转链表】(C语言)_结点_06


LeetCode刷题(1)【链表】【反转链表】(C语言)_链表_07


LeetCode刷题(1)【链表】【反转链表】(C语言)_链表_08


什么时候结束

n2 == NULL;


重复的条件用循环解决

  1. 初始条件
  2. 迭代过程
  3. 结束条件
    画图看起来很浪费时间,但提升了写代码的体验,更好的解决问题。

代码实现:

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/

struct ListNode* reverseList(struct ListNode* head){
if(head == NULL)
{
return NULL;
}
//初始化条件
struct ListNode* n1 = NULL,*n2 = head,*n3 = n2->next;
//结束条件
while(n2 != NULL)
{
//迭代过程
n2->next = n1;
//往后推移
//两个相等就是往后推移
n1 = n2;
n2 = n3;
if(n3 != NULL)
{
n3 = n3->next;
}
}
return n1;
}

思路二:头插法
取结点头插到新链表中。cur是当前操作结点,用一个next来保存下一个结点(同上)。
文字简单描述:
​ 从原链表去一个点下来,放到新的链表中,当做新链表的头结点cur = newhead,
迭代往后走,取下一个结点…
代码实现:

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/

struct ListNode* reverseList(struct ListNode* head){
struct ListNode* cur = head;
struct ListNode* newHead = NULL;
while(cur != NULL)
{
struct ListNode* next = cur->next;
//头插法
cur->next =newHead;
newHead = cur;
cur = next;
}
return newHead;
}


标签:NULL,ListNode,struct,next,链表,n1,n2,C语言,LeetCode
From: https://blog.51cto.com/u_15333750/5866167

相关文章

  • 【链表】双向循环带头链表-增-删-查(C语言)
    我的小站——半生瓜のblog——同步更新单链表存在的缺陷:不能从后往前走,找不到他的前驱,指定位置删除增加尾删都要找前一个,时间复杂度都是O(n)针对上面的这些缺陷的解决......
  • 【链表】单链表-增-删-查(C语言)
    我的小站——半生瓜のblog单链表​​结构体定义​​​​打印​​​​创建结点​​​​尾插​​​​头插​​​​尾删​​​​头删​​​​查找​​​​在指定位置前插入某个......
  • 【线性表】之顺序表(C语言)
    【线性表】之顺序表​​线性表​​​​顺序表​​​​结构定义​​​​初始化​​​​销毁​​​​打印​​​​扩展空间​​​​尾插​​​​头插​​​​尾删​​​​头删......
  • LeetCode刷题(4)【移除元素&合并两个有序数组】(C语言)(含图解)
    移除元素典型双指针玩法。27.移除元素-力扣(LeetCode)(leetcode-cn.com)我们都会想到这样的解法:从前面依次往后推,是val就将该数据后面的元素依次覆盖上来,但是这样的时间复......
  • LeetCode刷题(5)【链表】【环形链表II】(C语言)
    环形链表I​​LeetCode刷题(3)【链表】【环形链表】&扩展_半生瓜のblog-CSDN博客​​环形链表II142.环形链表II-力扣(LeetCode)(leetcode-cn.com)这个题写起来不难,但是证......
  • 【线性表】之栈(C语言)
    栈​​回顾​​​​栈​​​​结构定义​​​​初始化​​​​销毁​​​​入栈​​​​出栈​​​​返回栈顶元素​​​​返回栈中元素个数​​​​判断栈是否为空​​​​......
  • 【线性表】之队列(C语言)
    队列​​队列的概念​​​​结构定义​​​​初始化​​​​销毁​​​​队尾入​​​​队头出​​​​队头出​​​​队头数据​​​​队尾数据​​​​是否为空​​​​返......
  • LeetCode刷题(7)【栈&队列】用队列实现栈(C语言)
    用队列实现栈225.用队列实现栈-力扣(LeetCode)(leetcode-cn.com)目的:用队列实现栈,从先进先出——>先进后出,1234这四个数据依次从队列1的队尾进入,要让4先出,一个队列是无法......
  • LeetCode刷题(2)【链表】【合链表&链表的中间结点】(C语言)
    我的小站——半生瓜のblog快慢指针问题:思路:定义一个快指针和一个慢指针,快指针走到结束的时候,慢指针刚好走到一半。链表的中间结点。876.链表的中间结点-力扣(LeetCode)(le......
  • LeetCode刷题(3)【链表】【环形链表】&扩展(C语言)
    我的小站——半生瓜のblog环形链表141.环形链表-力扣(LeetCode)(leetcode-cn.com)什么是链表带环:链表的最后一个元素不指向空而指向前面的某个结点。思路:快慢指针,慢指针走......