跨境派

跨境派

跨境派,专注跨境行业新闻资讯、跨境电商知识分享!

当前位置:首页 > 卖家故事 > 反转链表的四种方法(C语言)

反转链表的四种方法(C语言)

时间:2024-04-14 10:50:30 来源:网络cs 作者:胡椒 栏目:卖家故事 阅读:

标签: 方法  语言 
阅读本书更多章节>>>>

文章目录

方法一 原地反转方法二 迭代方法三 递归方法四 新建链表法
206. 反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

img

输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]

示例 2:

img

输入:head = [1,2] 输出:[2,1]

示例 3:

输入:head = [] 输出:[]

提示:

链表中节点的数目范围是 [0, 5000]-5000 <= Node.val <= 5000

方法一 原地反转

本题链表不带头结点
原地反转需要两个指针,以防pre指针操作后指向上一节点而丢失指向下一节点的指针
在这里插入图片描述

pre->next = cur->next:1.连:第一步先将pre所在节点和cur->next所在节点连接起来,将当前节点 cur 从链表中移除,并把链表连接起来。
在这里插入图片描述
cur->next = head;2.掉:将cur的next指向head,将cur插入到head的前面,以便将其放置到链表的前面,成为新的头节点。 在这里插入图片描述

head = cur;3.接:更新head,使其指向当前的cur
在这里插入图片描述

cur = pre->next;4.移:更新cur,移动到下一个待反转的节点
在这里插入图片描述

struct ListNode* reverseList(struct ListNode* head) {    if (head == NULL) {        return head;    }    struct ListNode* cur = head->next;     struct ListNode* pre = head;     while (cur) {        pre->next = cur->next;         cur->next = head;         head = cur;           cur = pre->next;     }    return head; }

方法二 迭代

temp保存cur的下一个节点,以防止反转时丢失链表信息。
在这里插入图片描述

cur->next = pre;cur的下一个指针指向pre,实现反转。
在这里插入图片描述

更新pre为当前的cur,为下一次迭代做准备。
更新cur为保存的下一个节点temp,继续迭代。
在这里插入图片描述
通过不断改变指针的指向将链表进行反转。pre充当新链表的头节点,当curNULL循环停止,返回pre

struct ListNode* reverseList(struct ListNode* head) {    struct ListNode* pre = NULL;    struct ListNode* cur = head;    while (cur != NULL) {        struct ListNode* temp = cur->next;        cur->next = pre;        pre = cur;        cur = temp;    }    return pre;}

方法三 递归

我们可以通过迭代的方法来得到递归方法
观察reverse函数,
函数声明中pre指针指向的为NULL,cur指针指向的为head,正如递归中声明并初始化的precur指针
递归结束条件为curNULL,返回pre
同样temp保存cur的下一个节点,以防止反转时丢失链表信息。
然后进行反转cur->next = pre;
pre 为当前已反转部分的头节点,cur为当前待反转的节点。
然后调用递归,将cur作为新的pre传入下一层,将temp作为新的cur传入下一层。
实现了链表的递归反转

struct ListNode* reverse(struct ListNode* pre, struct ListNode* cur) {    if (!cur){        return pre;    }    struct ListNode* temp = cur->next;    cur->next = pre;    //将cur作为pre传入下一层    //将temp作为cur传入下一层,改变其指针指向当前cur    return reverse(cur, temp);}struct ListNode* reverseList(struct ListNode* head) {    return reverse(NULL, head);}

方法四 新建链表法

struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
newNode->val = head->val;
新建一个链表,并初始化
newNode->next = newHead;将新节点插入到新链表的头部

在这里插入图片描述
newHead = newNode;
在这里插入图片描述
head = head->next;
在这里插入图片描述
遍历原链表,使用头插法新建链表,并不断移动newHead指针,当原链表头指针指向NULL最终返回newHead

struct ListNode* reverseList(struct ListNode* head) {    struct ListNode* newHead = NULL;    while (head) {        // 创建一个新节点        struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));        newNode->val = head->val;                // 将新节点插入到新链表的头部        newNode->next = newHead;        newHead = newNode;        // 移动到原链表的下一个节点        head = head->next;    }    return newHead;}


感谢您的阅读

阅读本书更多章节>>>>

本文链接:https://www.kjpai.cn/gushi/2024-04-14/158436.html,文章来源:网络cs,作者:胡椒,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

文章评论