链表——设计链表

#include<iostream>
using namespace std;
/*
1.获取第n个节点的值
2.头部插入节点
3.尾部插入节点
4.第n个节点前插入节点
5.删第n个节点
*/

class MyLinkList
{
public:
	// 定义链表节点结构体
	struct LinkedNode
	{
		int val;
		LinkedNode* next;
		LinkedNode(int val) :val(val), next(nullptr) {}
	};

        /**
       * Definition for singly-linked list.
       * struct ListNode {
       *     int val;
       *     ListNode *next;
       *     ListNode() : val(0), next(nullptr) {}
       *     ListNode(int x) : val(x), next(nullptr) {}
       *     ListNode(int x, ListNode *next) : val(x), next(next) {}
       * };
       */

	// 初始化链表
	MyLinkList()
	{
		_dummyHead = new LinkedNode(0);		// 这里定义的头结点 是一个虚拟头结点,而不是真正的链表头结点
		_size = 0;
	}

	// 获取到第index个节点数值,如果index是非法的则返回-1,注意index是从0开始的,第0个节点就是头节点
	int get(int index)
	{
		if (index > _size || index < 0)
		{
			return -1;
		}
		LinkedNode* cur = _dummyHead->next;			// 初始时将其指在head处,即第0个节点处
		while (index--)
		{
			cur = cur->next;
		}
		return cur->val;
	}

	// 在链表的最前面插入一个节点,插入完成后,新插入的节点为链表的新的头结点
	void addAtHead(int val)
	{
		LinkedNode* newNode = new LinkedNode(val);
		newNode->next = _dummyHead->next;
		_dummyHead->next = newNode;
		_size++;
	}

	// 在链表最后面添加一个节点
	void addAtTail(int val)
	{
		LinkedNode* newNode = new LinkedNode(val);
		LinkedNode* cur = _dummyHead;
		while (cur->next != nullptr)
		{
			cur = cur->next;
		}
		cur->next = newNode;
		_size++;
	}

	// 在第index个节点之前插入一个新节点,如果index=0,那么插入的节点为链表的新头节点
	// 如果index等于链表长度,则说明新插入节点为链表的尾节点
	// 如果index大于链表长度,则返回为空
	// 如果index小于0,返回为空

	void addAtIndex(int index, int val)
	{
		if (index > _size || index < 0)
		{
			return;
		}
		LinkedNode* newNode = new LinkedNode(val);
		LinkedNode* cur = _dummyHead;
		while (index--)
		{
			cur = cur->next;
		}
		newNode->next = cur->next;
		cur->next = newNode;
		_size++;
	}

	// 删除第index个节点,如果index大于等于链表的长度,直接return,注意index是从0开始
	void deleteAtIndex(int index)
	{
		if (index > _size || index < 0)
		{
			return;
		}
		LinkedNode* cur = _dummyHead;
		while (index--)
		{
			cur = cur->next;
		}
		LinkedNode* temp = cur->next;
		cur->next = cur->next->next;
		delete temp;
		_size--;
	}

	// 打印链表
	void printLinkedList()
	{
		LinkedNode* cur = _dummyHead;
		while (cur->next != nullptr)
		{
			cout << cur->next->val << endl;
			cur = cur->next;
		}
		cout << endl;
	}

private:
	int _size;
	LinkedNode* _dummyHead;
};
posted @   香花草的味道  阅读(60)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示