我的
想法:
问题:
正确
思路:
适用场景:
代码
//题目:
/*
* 学习到:
* 写代码过程中:
* 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;
}
学习到
代码编写过程中
-
- 类成员变量使用'_',变量名前后都可
-
- 要弄清出index(第几个元素,从0开始)与_size(链表中元素个数)的意义
-
代码调试过程中
代码思维
- 代码逻辑:
-
- 写代码之前,一定要弄清出目的,以及实现他需要的东西,条件
-
- 操作前一个节点:删除,添加
-
- 操作当前节点:获取值
-
- 元素个数比最大下标大1