【算法与数据结构】707.、LeetCode设计链表

news/2024/10/18 9:21:32/

文章目录

  • 一、题目
  • 二、设计链表
  • 三、完整代码

所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。

一、题目

在这里插入图片描述

在这里插入图片描述

二、设计链表

  思路分析:这里我将的成员函数放在类外实现了,这样链表类看起来更加简洁,方便大家学习链表的结构,主要包含:节点类结构体,构造函数(构造函数也可以放在类外实现),成员函数和成员变量类的成员函数实现主要有两种,一种是类内实现,一种是类外实现,类外实现需要在类内写声明,然后在类外写实现。构造函数初始化一个虚假头结点和链表大小。关于虚假头结点,可以参考【算法与数据结构】203、LeetCode移除链表元素。
  链表类如下

// 链表类
class MyLinkedList {
public:   // 定义链表节点类结构体struct LinkNode {int val;LinkNode* next;LinkNode() : val(0), next(NULL) {};LinkNode(int input_val) : val(input_val), next(NULL) {};LinkNode(int input_val, LinkNode* input_next) : val(input_val), next(input_next) {};};// 构造函数MyLinkedList() {_FakeNode = new LinkNode(0);    // 虚假头结点_size = 0;}
// 成员函数int get(int index);void addAtHead(int val);void addAtTail(int val);void addAtIndex(int index, int val);void deleteAtIndex(int index);void ChainGenerator(int arr[], int len);void LinkListPrint(string str);
// 成员变量
private:int _size;LinkNode* _FakeNode;
};

  讲完整体构造,然后将各个部分。
  首先是get函数:进入链表首先判断index是否合法,然后链表从虚假头结点出发,利用index,当找到目标索引时,cur就指向这个值,index自减归于0退出循环

int MyLinkedList::get(int index) { if (index > (_size - 1) || index < 0) return -1;LinkNode* cur = _FakeNode->next; // 头结点while (index--) {cur = cur->next;}return cur->val;
}

  addAtHead函数:这个函数比较简单,我们新建一个节点,指向虚节点的下一个节点(也就是插入之前的头结点),然后让虚节点指向新建节点,最后链表大小+1。

void MyLinkedList::addAtHead(int val) {LinkNode* pNewNode = new LinkNode(val, _FakeNode->next);_FakeNode->next = pNewNode;_size++;
}

  addAtTail函数:addTail函数需要遍历这个链表,找到尾节点,复杂度是 O ( n ) O(n) O(n),让尾节点指向新建节点即可。

void MyLinkedList::addAtTail(int val) {LinkNode* pNewNode = new LinkNode(val);LinkNode* cur = _FakeNode;while (cur->next != NULL) {cur = cur->next;}cur->next = pNewNode;_size++;
}

  addAtIndex函数:前两个函数都可以用这个函数实现,在这个函数中,首先根据题目条件判断index是否合法,令cur指针等于虚节点,同样使用index找到插入位置的上一个节点,然后就是链表的插入操作。

void MyLinkedList::addAtIndex(int index, int val) {   if (index > _size) return;if (index < 0) index = 0;LinkNode* cur = _FakeNode; // 虚结点 // 需要断开上一一个阶段的链接,从插入位置的上一个索引开始处理while (index--) {cur = cur->next;}LinkNode* pNewNode = new LinkNode(val, cur->next);cur->next = pNewNode;_size++;
}

  deleteAtIndex函数:这个函数可以参考【算法与数据结构】203、LeetCode移除链表元素。

void MyLinkedList::deleteAtIndex(int index) {     if (index > (_size - 1) || index < 0) return;LinkNode* cur = _FakeNode; // 头结点// 需要断开上一一个阶段的链接while (index--) {cur = cur->next;}LinkNode* tmp = cur->next;cur->next = cur->next->next;delete tmp;tmp = NULL;_size--;
}

  ChainGenerator函数和LinkListPrint函数:除了题目要求的函数以外,我还写了数组生成链表函数,以及链表打印函数。这两个函数在main函数中调用,方便调试。

void MyLinkedList::ChainGenerator(int arr[], int len) {if (_FakeNode->next != NULL) return;LinkNode* head = new LinkNode(arr[0], NULL);LinkNode* p = head;for (int i = 1; i < len; i++) {LinkNode* pNewNode = new LinkNode(arr[i], NULL);p->next = pNewNode; // 上一个节点指向这个新建立的节点p = pNewNode; // p节点指向这个新的节点}_FakeNode->next = head;_size = len;
}
void MyLinkedList::LinkListPrint(string str) {cout << str << endl;LinkNode* cur = _FakeNode;while (cur->next != NULL) {cout << cur->next->val << ' ';cur = cur->next;}cout << endl;
}

三、完整代码

# include <iostream>
using namespace std;// 链表类
class MyLinkedList {
public:   // 定义链表节点类结构体struct LinkNode {int val;LinkNode* next;LinkNode() : val(0), next(NULL) {};LinkNode(int input_val) : val(input_val), next(NULL) {};LinkNode(int input_val, LinkNode* input_next) : val(input_val), next(input_next) {};};// 构造函数MyLinkedList() {_FakeNode = new LinkNode(0,NULL);    // 虚假头结点_size = 0;}
// 成员函数int get(int index);void addAtHead(int val);void addAtTail(int val);void addAtIndex(int index, int val);void deleteAtIndex(int index);void ChainGenerator(int arr[], int len);void LinkListPrint(string str);
// 成员变量
private:int _size;LinkNode* _FakeNode;
};// 类外实现链表的成员函数
int MyLinkedList::get(int index) { if (index > (_size - 1) || index < 0) return -1;LinkNode* cur = _FakeNode->next; // 头结点while (index--) {cur = cur->next;}return cur->val;
}void MyLinkedList::addAtHead(int val) {LinkNode* pNewNode = new LinkNode(val, _FakeNode->next);_FakeNode->next = pNewNode;_size++;
}void MyLinkedList::addAtTail(int val) {LinkNode* pNewNode = new LinkNode(val);LinkNode* cur = _FakeNode;while (cur->next != NULL) {cur = cur->next;}cur->next = pNewNode;_size++;
}void MyLinkedList::addAtIndex(int index, int val) {   if (index > _size) return;if (index < 0) index = 0;LinkNode* cur = _FakeNode; // 虚结点 // 需要断开上一一个阶段的链接,从插入位置的上一个索引开始处理while (index--) {cur = cur->next;}LinkNode* pNewNode = new LinkNode(val, cur->next);cur->next = pNewNode;_size++;
}void MyLinkedList::deleteAtIndex(int index) {     if (index > (_size - 1) || index < 0) return;LinkNode* cur = _FakeNode; // 头结点// 需要断开上一一个阶段的链接while (index--) {cur = cur->next;}LinkNode* tmp = cur->next;cur->next = cur->next->next;delete tmp;tmp = NULL;_size--;
}void MyLinkedList::ChainGenerator(int arr[], int len) {if (_FakeNode->next != NULL) return;LinkNode* head = new LinkNode(arr[0], NULL);LinkNode* p = head;for (int i = 1; i < len; i++) {LinkNode* pNewNode = new LinkNode(arr[i], NULL);p->next = pNewNode; // 上一个节点指向这个新建立的节点p = pNewNode; // p节点指向这个新的节点}_FakeNode->next = head;_size = len;
}void MyLinkedList::LinkListPrint(string str) {cout << str << endl;LinkNode* cur = _FakeNode;while (cur->next != NULL) {cout << cur->next->val << ' ';cur = cur->next;}cout << endl;
}int main()
{int arr[] = { 2, 3};int len = sizeof(arr) / sizeof(int);MyLinkedList m1;m1.ChainGenerator(arr, len);m1.LinkListPrint("打印链表:");m1.addAtHead(1);m1.addAtTail(5);m1.LinkListPrint("打印链表:");m1.addAtIndex(3, 4);m1.addAtIndex(5, 666);m1.LinkListPrint("打印链表:");m1.deleteAtIndex(5);m1.LinkListPrint("打印链表:");int val1 = m1.get(0);cout << "目标索引的值:" << val1 << endl;system("pause");return 0;
}

end


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

相关文章

英雄无敌3.win10下无法工作

32位的.据说打上11.reg文件就阔仪了. 但是我是64位的系统.所以 打开txt REGEDIT4[HKEY_LOCAL_MACHINE\Software\Wow6432Node\New World Computing][HKEY_LOCAL_MACHINE\Software\Wow6432Node\New World Computing\Heroes of Might and Magic?III][HKEY_LOCAL_MACHINE\Softw…

英雄无敌3pc移植android版,今日手游:全盘移植《魔法门之英雄无敌3》

导 读 《魔法门之英雄无敌3高清版》单纯以《埃拉西亚的光复》作为移植版本&#xff0c;这就造成游戏中缺少一个元素种族和12件顶级宝物还有多个地图&#xff0c;这对于该系列的忠实拥趸来讲&#xff0c;不能不说是一种遗憾。 ... 《魔法门之英雄无敌3高清版》单纯以《埃拉西亚的…

android 死亡阴影,英雄无敌3死亡阴影单机版

英雄无敌3死亡阴影单机版作为《英雄无敌》系列的第三部&#xff0c;游戏中不仅吸收了前作经典的魔幻题材&#xff0c;同时游戏创造性的将dota&#xff0c;lol等众多知名英雄合理的融入到战棋玩法中&#xff0c;让游戏耳目一新&#xff0c;与众不同&#xff01;游戏涵盖了卡牌收…

在linux下运行英雄,在 Linux 下玩《英雄无敌 3》游戏

下面就是我要讲的主要部分,怎么对补丁进行hack。 用vim打开heroes3-1.3.1-x86.run,搜索 +6 ,发现是作为tail的参数。 表示从文件第六行的内容。 但是这样使用参数是错误的,正确的使用方法是 tail --lines=+6 。 所以把 +6 的部分都改正为 --lines=+6 。 这样 tail: cannot …

英雄无敌3 Heroes III 里面的英语单词 (转)

英雄无敌3 Heroes III 里面的英语单词 (转)[more] 来自 “ ITPUB博客 ” &#xff0c;链接&#xff1a;http://blog.itpub.net/10752043/viewspace-997860/&#xff0c;如需转载&#xff0c;请注明出处&#xff0c;否则将追究法律责任。 转载于:http://blog.itpub.net/1075204…

影之刃3如何在电脑上玩 影之刃3模拟器玩法教程

《影之刃3》最让我惊喜的&#xff0c;不是群像剧设定&#xff0c;也不是《黑魂》、《进击的巨人》等原创大佬们的加入&#xff0c;而是一代的技能链回归&#xff0c;这个设定简直太棒了&#xff01;虽然当年的我只会去复制PK榜上大佬们的链子。还有一点值得说&#xff0c;那就是…

英雄无敌5东方部落秘籍

用windows自带的笔记本打开文件&#xff1a;autoexec_a2.cfg   位置&#xff1a;游戏安装目录\profiles\autoexec_a2.cfg   记得编辑之前备份先&#xff0c;然后在文件的最后一行加入(加在// Startup部分)&#xff1a;   setvar dev_console_password schwinge-des-tode…

Ubuntu Linux 18.10下面安装魔法门之英雄无敌3

不废话&#xff0c;直接进入正题&#xff1a; &#xff11;.Heroes.of.Might.and.Magic.3.Linux.[mulek.info].iso 这个资源是32位 下载链接&#xff1a; 链接: https://pan.baidu.com/s/1Cut226Ipk8g20ja2aAejbw 提取码: yrpq 2.Xubuntu18.10 amd64 好了你们会发现我上面的是…