代码随想录算法训练营第三天 | 203.移除链表元素,707.设计链表,206.反转链表

news/2025/2/16 3:49:41/

203. 移除链表元素
正确运行的代码如下:

truct ListNode* removeElements(struct ListNode* head, int val){while (head && head->val == val){head = head->next;}struct ListNode * cur = head;while (cur && cur->next){// printf("cur->val = %d\n", cur->val);while (cur->next && cur->next->val == val){cur->next = cur->next->next;}cur = cur ->next;}return head;
}

或者通过创建一个虚拟头节点。

struct ListNode* removeElements(struct ListNode* head, int val){struct ListNode * dummyHead = (struct ListNode *)malloc(sizeof(struct ListNode));dummyHead->next = head;struct ListNode * cur = dummyHead;while (cur->next){if (cur->next->val == val){cur->next = cur->next->next;}else {cur = cur->next;}}return dummyHead->next;
}

以下是错误代码,不知道为什么超出时间限制。我通过打印运行结果,初步认为是无法判断链表结束。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/struct ListNode* removeElements(struct ListNode* head, int val){struct ListNode * pHead = NULL, * p = head, * q;while (p && p->val == val){p = p->next;}pHead = p;q = pHead;if (q){while (p){if (p->val != val){q->next = p;q = q->next;}p = p->next;}}return pHead;
}

707. 设计链表
这道题目包含了链表的基本操作,按照代码随想录的视频,设置了虚拟头节点来进行操作。

区分相关概念:
首节点:链表的第一个有效节点。
尾节点:最后一个有效节点。
头节点:链表的第一个有效节点之前的那个节点,头节点并不存放有效数据。加头节点的目的主要是为了方便对链表的操作。
头指针:指向头节点的指针变量。
尾指针:指向尾节点的指针变量。

为什么在遍历链表的时候要定义一个指针来遍历,而不是直接操作头指针?
这是因为我们要操作完链表之后要返回头节点,如果直接操作头节点的话,那头节点的值都被修改了,那么如何返回链表的头节点呢?所以要定义一个临时指针指向头节点进行遍历。

对于这道题目而言,一定要明白第n个节点在哪里,以及如何对链表进行插入数据。
注意链表中的所有节点下标从 0 开始。
正确运行的代码如下。

typedef struct {int val;struct MyLinkedList * next;
} MyLinkedList;MyLinkedList* myLinkedListCreate() {MyLinkedList * dummyhead = (MyLinkedList *) malloc (sizeof(MyLinkedList));dummyhead->val = 0;dummyhead->next = NULL;return dummyhead;
}int myLinkedListGet(MyLinkedList* obj, int index) {MyLinkedList * cur = obj->next;while (index-- && cur){cur = cur->next;}if (cur){return cur->val;}return -1;
}void myLinkedListAddAtHead(MyLinkedList* obj, int val) {MyLinkedList * q = (MyLinkedList *) malloc (sizeof(MyLinkedList));q->val = val;q->next = obj->next;obj->next = q;
}void myLinkedListAddAtTail(MyLinkedList* obj, int val) {MyLinkedList * q = (MyLinkedList *) malloc (sizeof(MyLinkedList));q->val = val;q->next = NULL;MyLinkedList * cur = obj;while (cur->next){cur = cur->next;}cur->next = q;
}void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) {MyLinkedList * cur = obj;while (index-- && cur){cur = cur->next;}MyLinkedList * q = (MyLinkedList *) malloc (sizeof(MyLinkedList));q->val = val;q->next = NULL;if (cur){q->next = cur->next;cur->next = q;}
}void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {MyLinkedList * cur = obj;MyLinkedList * q;while (index--){cur = cur->next;}if (cur && cur->next){q = cur->next;cur->next = q->next;}}void myLinkedListFree(MyLinkedList* obj) {while (obj){MyLinkedList * q = obj;obj = obj->next;free(q);}
}

以下是错误代码,还没有想明白是为什么。

typedef struct Node{ //定义链表的节点的结构体int val; //数据域struct Node * next; //指针域
}Node, * pNode;typedef struct { //定义链表的结构体pNode dummyhead; //头指针int len; //链表长度
} MyLinkedList;MyLinkedList* myLinkedListCreate() {MyLinkedList * list = (MyLinkedList *) malloc (sizeof(MyLinkedList));list->dummyhead = NULL;list->len = 0;return list;
}int myLinkedListGet(MyLinkedList* obj, int index) {if (index < 0 || index >= obj->len){return -1;}pNode cur = obj->dummyhead;while (index--){cur = cur->next;}return cur->val;
}void myLinkedListAddAtHead(MyLinkedList* obj, int val) {pNode q = (pNode) malloc (sizeof(Node));q->val = val;q->next = NULL;pNode cur = obj->dummyhead;if (cur){q->next = cur->next;cur->next = q;obj->len++;}
}void myLinkedListAddAtTail(MyLinkedList* obj, int val) {pNode q = (pNode) malloc (sizeof(Node));q->val = val;q->next = NULL;pNode cur = obj->dummyhead;while (cur && cur->next){cur = cur->next;}if (cur){cur->next = q;obj->len++;}
}void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) {if (index < 0 || index > obj->len){return;}else if (index == 0){myLinkedListAddAtHead(obj, val);}else if (index == obj->len){myLinkedListAddAtTail(obj, val);}else {pNode q = (pNode) malloc (sizeof(Node));q->val = val;q->next = NULL;pNode cur = obj->dummyhead;while (index--){cur = cur->next;}q->next = cur->next;cur->next = q;obj->len++;}
}void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {if (index >= 0 && index < obj->len){pNode cur = obj->dummyhead;while (index--){cur = cur->next;}cur->next = cur->next->next;obj->len--;}
}void myLinkedListFree(MyLinkedList* obj) {pNode q, cur = obj->dummyhead;while (obj->len--){q = cur->next;free(q);cur = cur->next;}
}/*** Your MyLinkedList struct will be instantiated and called as such:* MyLinkedList* obj = myLinkedListCreate();* int param_1 = myLinkedListGet(obj, index);* myLinkedListAddAtHead(obj, val);* myLinkedListAddAtTail(obj, val);* myLinkedListAddAtIndex(obj, index, val);* myLinkedListDeleteAtIndex(obj, index);* myLinkedListFree(obj);
*/

206. 反转链表
注意掌握双指针解法以及递归写法。

struct ListNode* reverseList(struct ListNode* head){struct ListNode * pre = NULL, * cur = head; //初始化变量while (cur){struct ListNode * tmp = cur->next; //临时变量保存cur->next = pre; //反转pre = cur; //更新变量cur = tmp;}return pre; //返回头节点
}
struct ListNode * reverse(struct ListNode * cur, struct ListNode * pre){if (!cur){return pre;}struct ListNode * tmp = cur->next;cur->next = pre;return reverse(tmp, cur);
}struct ListNode* reverseList(struct ListNode* head){return reverse(head, NULL);
}

继续加油~


http://www.ppmy.cn/news/189863.html

相关文章

dhcp服务器自动分配地址思科,思科服务器配置dhcp服务器方法

因为现在生活中网络的流行以及广泛的使用&#xff0c;但企业和学校都会配备思科服务器&#xff0c;因为在配备了服务器之后&#xff0c;可以让不论在什么地方的电脑&#xff0c;只要连接上局域网之后&#xff0c;就可以通过自动获取Ip地址的方式获取Ip地址网关&#xff0c;这样…

思科FTP服务器基本配置

思科FTP服务器基本配置 参赛话题&#xff1a;学习笔记https://activity.csdn.net/creatActivity?id10213 ​ 目录 一、准备TFTP服务器 二、备份IOS 三、从TFTP升级IOS 四、备份配置文件到TFTP服务器 五、从TFTP下载配置文件 一、准备TFTP服务器 Router# ping tftp_addres…

思科服务器dns配置文件,思科完成dns服务器配置

思科完成dns服务器配置 内容精选 换一换 云速建站支持以下三种情况的域名解析:您在华为云购买域名,使用华为云解析服务。您在第三方购买域名,使用华为云解析服务。您可以通过云速建站域名配置助手或者手动操作完成域名的解析和绑定,推荐使用云速建站域名配置助手,由云速建…

cisco在服务器编辑首页信息,cisco设置

cisco路由向来以难配置而绝不天下。那么cisco怎么设置vlan ip?秋天网 Qiutian.ZqNF.Com小编整理了相关资料&#xff0c;给大家介绍。有需要学习的同学可参考参考。 cisco设置vlan ip步骤 1.注意事项 1.1.交换机启动需要大约4-5分钟; 1.2.网线插入交换机接口从黄变为绿需要大约…

cisco服务器设置步骤_设置您自己的邮件服务器的10个步骤

cisco服务器设置步骤 A simple guide to setup your own mail server using MailCow, DigitalOcean and Docker 使用MailCow,DigitalOcean和Docker设置自己的邮件服务器的简单指南 Setting a mail server is easy and hard at the same time. What an irony! Let’s begin wi…

思科高计算性能服务器,全面解析:思科UCS统一计算刀片服务器

【IT168 评论】思科统一计算系统是下一代数据中心平台,在一个紧密结合的系统中整合了计算、网络、存储接入与虚拟化功能,旨在降低总体拥有成本(TCO),同时提高业务灵活性。该系统包含一个低延时无丢包万兆以太网统一网络阵列,以及多台企业级x86架构服务器。它是一个集成的可…

【华为思科】访问web服务器

加深对网络体系的理解&#xff0c;一台主机主机访问浏览器。 搭建网络拓扑 拖动PC机和服务器&#xff1a; 采用自动连接&#xff1a; 如下&#xff1a; 网络配置与查看 给计算机设置IP地址&#xff1a; 服务器设置IP地址&#xff1a; 切换到仿真模式&#xff1a; 隐…

思科服务器dns配置文件,cisco设置dns方法

有网友这么问 “cisco怎样设置dns?”&#xff0c; 在网上搜索了一些资料&#xff0c;供大家参考。 所谓DNS&#xff0c;其是由解析器和域名服务器组成的&#xff0c;也是网络不可缺少的组成部分&#xff0c;尤其在大型网络中基本都是需要配置DNS服务器的。思科 一、配置DNS服务…