算法day9 设计链表

题目描述

思路
整体的思路的话就是增删查三大件,是很常规的一道题。问题在于在leetcode的环境下要自己在类中定义链表结构体。这里比较坑,因为之前的题目基本函数实现所需要的前置条件初始模板都已给出,所以这里可能会让人很疑惑,不知从何下手。由于本题总共涉及到五个函数,所以接下来对链表的初始化以及五个函数逐一介绍。

1.链表节点结构体:

class MyLinkedList {
public:
struct ListNode{//结构体定义
int val; //数据域
ListNode *next; //指针域
ListNode(int x):val(x),next(nullptr){} //构造函数。这个构造函数可以自己给出,当然如果不写的话c++也会提供一个默认的构造函数,但不具有初始化功能,推荐自己写

private:
ListNode *_dummyhead; //私有类成员,作为虚拟头节点,便于链表操作的统一
int _size; //链表长度
};

2.初始化链表

MyLinkedList() {
_dummyhead = new ListNode(0);
_size = 0;
}

3.获取第index个节点数值

int get(int index) {
if(index< 0 || index >(_size-1)){//判断一下边界
return -1;
}
ListNode *cur = _dummyhead -> next;
while(index--){//迭代指针到我们的目标位置
cur = cur -> next;
}
return cur -> val;
}

4.在头部插入节点

void addAtHead(int val) {
ListNode *newNode = new ListNode(val); //创建节点
//使新创建的节点链接在虚拟头节点的后驱
newNode -> next = _dummyhead -> next;
_dummyhead -> next = newNode;
_size++; //更新size大小
return;
}

5.在尾部插入节点

void addAtTail(int val) {
ListNode *newNode = new ListNode(val);
ListNode *cur = _dummyhead ;
while(cur->next!=nullptr){//迭代到尾部
cur = cur -> next;
}
cur -> next = newNode;
newNode -> next = nullptr;//newNode成为了实际上的节点
_size++;
return;
}

6.在index处插入节点

void addAtIndex(int index, int val) {
if(index<0||index>_size){
return;
}
ListNode *newNode = new ListNode(val);
ListNode *cur = _dummyhead;
int cnt = index;
while(cnt--){//迭代
cur = cur ->next;
}
//使newNode置于index位置节点的前驱与index处节点之间
newNode -> next = cur -> next;
cur -> next = newNode;
_size++;
return;

}

7.删除index处节点

void deleteAtIndex(int index) {
if(index<0||index>_size-1){
return;
}
ListNode *cur = _dummyhead;
while(index--){迭代到要删除位置的前驱
cur = cur -> next;
}
ListNode *temp = cur -> next;
cur -> next = cur -> next ->next;
delete temp; //不要忘记释放内存
_size--;
return;
}

END

posted on 2025-04-13 18:09  sakura430  阅读(50)  评论(0)    收藏  举报