算法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
浙公网安备 33010602011771号