03-链表常见六个操作

我的

想法:

问题:

正确

思路:

适用场景:

代码

//题目:
/*
* 学习到:
* 写代码过程中:
* 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
posted @   行至为成  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示