首页 > 其他分享 >03-链表常见六个操作

03-链表常见六个操作

时间:2023-10-07 20:33:23浏览次数:34  
标签:03 curr index next 链表 ListNode 六个 节点 size

我的

想法:

问题:

正确

思路:

适用场景:

代码

//题目:
/*
* 学习到:
* 写代码过程中:
* 1. 类成员变量使用'_',变量名前后都可
* 2. 要弄清出index(第几个元素,从0开始)与_size(链表中元素个数)的意义
* 2. 
* 代码逻辑:
* 1. 写代码之前,一定要弄清出目的,以及实现他需要的东西,条件
* 2. 操作前一个节点:删除,添加
* 3. 操作当前节点:获取值
* 4. 元素个数比最大下标大1
* 
*/
#include <iostream>
using namespace std;
#include <vector>
//解决方法
class MylinkedList
{
public:
	//链表结构体
	struct ListNode {
		int val;
		ListNode* next;
		ListNode(int val) : val(val), next(nullptr) {}
	};

	//初始化链表
	MylinkedList() {
		_dummyNode = new ListNode(0);
		_size = 0;
	}

	//获得第index个节点的数值
	int get(int index) {
		//1非法index
		ListNode* curr = _dummyNode->next;
		if (index > (_size - 1) || index < 0) {
			return -1;
		}

		while (index--) {
			curr = curr->next;
		}

		return curr->val;

	}
	//头插法插入节点
	void addAtHead(int val) {
		//申请新节点并初始化
		ListNode* newNode = new ListNode(val);
		//头插
		newNode->next = _dummyNode->next;
		_dummyNode->next = newNode;
		
		_size++;

	}
	//尾插法插入新结点
	void addAtTail(int val) {
		//申请新节点并初始化
		ListNode* newNode = new ListNode(val);
		//用来遍历的指针curr
		ListNode* curr = _dummyNode;
		//找到原来尾结点
		while (curr->next != nullptr) {
			curr = curr->next;
		}

		curr->next = newNode;

		//维护变量
		_size++;
	}
	//在第index节点之前插入新节点:1-size-1是在该位置插入,需要找到其前节点;0是头插,size是尾插
	void addAtIndex(int index, int val) {
		//index最大是_size,
		if (index > _size) {
			cout << "插入位置不对,太大了" << endl;
			return;
		}
		//插入新节点的操作,index在0--size
		ListNode* newNode = new ListNode(val);
		ListNode* curr = _dummyNode;
		while (index--) {
			curr = curr->next;
		}

		newNode->next = curr->next;
		curr->next = newNode;

		_size++;
	}
	//删除第index个节点:index在0--size-1范围,操作其前一个节点
	void deleteAtIndex(int index) {
		//判断index是否正常范围
		if (index > (_size - 1) || index < 0) {
			return;
		}
		//遍历到第index-1个节点
		ListNode* curr = _dummyNode;

		while (index--) {
			curr = curr->next;
		}
		//删除第index节点,其前一个节点为curr
		ListNode* temp = curr->next;
		curr->next = curr->next->next;

		//维护变化后的状态
		_size--;
		delete temp;
	}
	//打印链表
	void printLinkedList() {
		//遍历并打印
		ListNode* curr = _dummyNode;
		while (curr->next != nullptr) {
			cout << curr->next->val << " ";
			curr = curr->next;
		}
		cout << endl;

	}
private:
	//成员变量
	ListNode* _dummyNode;
	int _size;


};
//主函数
int main()
{
	int a[] = { 0 };
	int target = 0;

	vector<int> nums(a, a + sizeof(a) / sizeof(a[0]));

	//Solution solution;
	cout << "方法调用" << endl;
	
	//实例化对象,并初始化
	MylinkedList myLinkedList;

	//调用头插
	myLinkedList.addAtHead(2);

	myLinkedList.addAtHead(22);

	//调用尾插
	myLinkedList.addAtTail(8);

	myLinkedList.addAtTail(33);

	//获得index=0的值
	cout << myLinkedList.get(0) << endl;
	//获得index=4的值
	cout << myLinkedList.get(4) << endl;

	//在第index=2位置插入
	myLinkedList.addAtIndex(2, 44);
	//在第index=6位置插入
	myLinkedList.addAtIndex(6, 44);

	//删除index=4
	myLinkedList.deleteAtIndex(4);

	//测试
	myLinkedList.printLinkedList();
	
	return 0;
}


学习到

代码编写过程中

    1. 类成员变量使用'_',变量名前后都可
    1. 要弄清出index(第几个元素,从0开始)与_size(链表中元素个数)的意义

代码调试过程中

代码思维

  • 代码逻辑:
    1. 写代码之前,一定要弄清出目的,以及实现他需要的东西,条件
    1. 操作前一个节点:删除,添加
    1. 操作当前节点:获取值
    1. 元素个数比最大下标大1

标签:03,curr,index,next,链表,ListNode,六个,节点,size
From: https://www.cnblogs.com/97rong/p/17747407.html

相关文章

  • 2023-2024-1 20231403 《计算机基础与程序设计》 第二周学习总结
    作业信息这个作业属于哪个课程<班级的链接>(如2022-2023-1-计算机基础与程序设计)这个作业要求在哪里2023-2024-1计算机基础与程序设计第二周作业)这个作业的目标学习两本课本的第一章内容作业正文https://www.cnblogs.com/lsrmy/p/17747323.html教材学习内......
  • CF506D Mr. Kitayuta's Colorful Graph
    好久没更新这个单题系列了,主要是最近没啥CF比赛空闲时间又少,今天忙里偷闲写了两个题这个题就比较典了,两点是否连通一般都是想到并查集维护,现在的问题是要对每种颜色的边把贡献算清楚很容易想到枚举所有颜色的边,每次求出所有连通分量后遍历一遍询问统计答案,这样正确性显然但复杂......
  • TypeError: Cannot read properties of undefined (reading '0')
    今天取请求返回值时报的一个错误,要取返回值中数组下标为零的数据,错误显示说未定义。检查之后发现要取的数据是请求返回的data中data,少嵌套了一层data导致数据为空报错。(返回数据的路径可以右键Copypropertypath,这样就不会错了)......
  • 数据库 "test1007" 的 创建 失败。其他信息: 执行 Transact-SQL 语句或批处理时发生
    问题描述在我使用sqlServer登录名和密码验证登录时,出现了创建数据库错误的信息;问题解决只需要在使用Windows身份验证进行登录后,在服务器角色里面找到dbeavor,然后将我们的登录名添加进去,保存之后,重新启动;之后再使用sqlServer验证登录连接之后,就能够建立好数据库啦!......
  • <class 'torch.nn.modules.conv.Conv1d'> torch.nn.Conv1d
     1、Conv1d定义classtorch.nn.Conv1d(in_channels,out_channels,kernel_size,stride=1,padding=0,dilation=1,groups=1,bias=True) 自然语言处理中一个句子序列,一维的,所以使用Conv1d,此时卷积核(没有batch_size,参数是共享的)除去chanel,也是一维的。 2、参数in_......
  • 03_tar打包
    tar打包管理root@bk:~/ckh#ls5.txt7.txt#打包test.tar.gzroot@bk:~/ckh#tar-cftest.tar.gz5.txt7.txtroot@bk:~/ckh#ls5.txt7.txttest.tar.gz#查看压缩包内容root@bk:~/ckh#tar-tftest.tar.gz5.txt7.txtroot@bk:~/ckh#ls5.txt7.txttest.t......
  • 01-建立静态链表
    一、实现思路1、声明一个结构体类型,成员有数据类型和指针变量next;2、将第一个结点的起始地址赋给头指针head,将第二个结点的起始地址赋给第一个结点的next成员,将第三个结点的起始地址赋值给第二个结点的next成员。第三个结点的next成员赋值为NULL,这样就形成了链表。二、程序设计......
  • 每个字符串从'/'到最后的内容都被替换为''
    list_1=['产品类型','后续机台','重量','可生产温度/℃','预计自然冷却时间/h','预计单面风机风机强冷时间/h','预计双面风机风机强冷时间/h']#请使用正则表达式给出pattern使得每个字符串从'/'到最后的内容都被替换为'',最终结果为['产品类型......
  • Leetcode刷题83. 删除排序链表中的重复元素
    给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。示例1:输入:head=[1,1,2]输出:[1,2]示例2:输入:head=[1,1,2,3,3]输出:[1,2,3] 提示:链表中节点数目在范围 [0,300] 内-100<=Node.val<=100题目数......
  • QT5.14: 打开文件出错warning: format '%s' expects argument of type 'char*'
    错误提示信息:D:\Demo\QT5.14\CH5\CH501\imgprocessor.cpp:158:warning:format'%s'expectsargumentoftype'char*',butargument2hastype'QChar*'[-Wformat=]printf("fileName:%s\n",filename.data());原函数代码:......