题意:
在链表类中实现这些功能:
- get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
- addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
- addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
- addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
- deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。
1.首先得先会链表节点结构体的创建
// 定义链表节点结构体
struct LinkedNode {
int val;
LinkedNode* next;
LinkedNode(int val):val(val), next(nullptr){}
};
其中的最后一行为初始化属性,详细可见C++核心编程-类和对象-初始化列表,
语法为: 构造函数():属性1(值1),属性2(值2)...{}
2.关于返回第n个节点的值
虚拟节点法去返回,这样能统一方法
定义一个cur指针指向真正的头节点去遍历(n--)
3.在第一个节点前加一个节点
new一个新的节点newNode,相当于在虚拟头节点与真实头节点之间添加了一个newNode节点。
4.在最后一个节点后添加一个节点
new一个新的节点newNode,判断当前指针的指向是否为空,不为空则current往后走。注意这里的cur应该从虚拟头节点开始,因为首先得判断是否为空链表,如果从头节点开始则默认不为空链表。
5.在第n个节点前添加一个节点
注意n的取值:n可以取的值有小于0一直到等于m_size,只有大于m_size的情况不会插入节点。
n<0时,可以把n置为0;因为作用当n=0时也为在头部插入节点。cur从虚拟头节点开始
6.删除第n个节点
n符合条件,用n做遍历,其中current从虚拟头节点开始,因为删除处理的总是cur->next这个节点!!另外注意delete释放掉不需要的节点!!
总结:只有返回第n个节点的值时,cur才从真实头节点开始,这是因为在返回时,while(n--)当n为0时,直接返回头节点的值,即为cur->val。
class MyLinkedList {
public:
//定义链表节点结构体
struct LinkedNode{
int val;
LinkedNode* next;
LinkedNode(int val):val(val),next(nullptr){}//初始化属性,在C++核心编程-类和对象里有提到
};
//初始化链表
MyLinkedList() {
_dummyhead=new LinkedNode(0);
m_size=0;
}
int get(int index) {
if(index<0||index>m_size-1)
return -1;
LinkedNode* cur=_dummyhead->next;
while(index--){
cur=cur->next;
}
return cur->val;
}
void addAtHead(int val) {
LinkedNode* newNode=new LinkedNode(val);
newNode->next=_dummyhead->next;
_dummyhead->next=newNode;
m_size++;
}
void addAtTail(int val) {
LinkedNode* newNode=new LinkedNode(val);
LinkedNode*cur=_dummyhead;
while(cur->next!=nullptr){
cur=cur->next;
}
cur->next=newNode;
m_size++;
}
void addAtIndex(int index, int val) {
LinkedNode* newNode=new LinkedNode(val);
LinkedNode* cur=_dummyhead;
if(index<0){
index=0;
}
else if(index<=m_size&&index>=0){
while(index--){
cur=cur->next;
}
newNode->next=cur->next;
cur->next=newNode;
m_size++;
}
else
return;
}
void deleteAtIndex(int index) {
if(index>=0&&index<m_size){
LinkedNode* cur=_dummyhead;
while(index--){
cur=cur->next;
}
LinkedNode* tmp=cur->next;
cur->next=cur->next->next;
delete tmp;
m_size--;
}
}
private:
int m_size;
LinkedNode* _dummyhead;
};
代码思路:代码随想录