设计链表 双链表 - lifengyu360/lifengyu_first_git_test GitHub Wiki
class MyLinkedList {
public:
//定义链表节点结构体
struct LinkedNode
{
int val;
LinkedNode *next;
LinkedNode(int val):val(val),next(nullptr){}
};
//初始化链表
MyLinkedList() {
m_dummyHead=new LinkedNode(0);
m_size=0;
}
//获取到第index个节点数值,如果index是非法数值直接返回-1,注意index是从0开始的,第0个节点就是头结点
int get(int index) {
if(index>m_size-1||index<0)
{
return -1;
}
LinkedNode *cur=m_dummyHead->next;
while(index--)//注意--index会陷入死循环
{
cur=cur->next;
}
return cur->val;
}
//在链表最前面插入一个结点,插入完成后,新插入的结点为链表的新的头结点
void addAtHead(int val) {
LinkedNode *newNode=new LinkedNode(val);
LinkedNode *cur=m_dummyHead;
newNode->next=cur->next;
cur->next=newNode;
m_size++;//注意++
}
//在链表最后面添加一个结点
void addAtTail(int val) {
LinkedNode *newNode=new LinkedNode(val);
LinkedNode *cur=m_dummyHead;
while(cur->next!=NULL)
{
cur=cur->next;
}
cur->next=newNode;
m_size++;//注意++
}
//在第index个节点之前插入一个新节点,例如index为0,那么新插入的节点为链表的新头结点
//如果index等于链表的长度,则说明是新插入和结点为链表的尾结点
//如果index大于链表的长度,则返回空
void addAtIndex(int index, int val) {
if(index>m_size)
{
return;
}
LinkedNode *newNode=new LinkedNode(val);
LinkedNode *cur=m_dummyHead;
while(index--)
{
cur=cur->next;
}
newNode->next=cur->next;
cur->next=newNode;
m_size++;//注意++
}
//删除第index个节点,如果index大于等于链表的长度,直接return,注意index是从0开始的
void deleteAtIndex(int index) {
if(index>=m_size||index<0)
{
return;
}
LinkedNode *cur=m_dummyHead;
while(index--)
{
cur=cur->next;
}
LinkedNode *tmp=cur->next;
cur->next=cur->next->next;
delete tmp;
m_size--;//注意--
}
private:
int m_size;
LinkedNode *m_dummyHead;
};
/**
- Your MyLinkedList object will be instantiated and called as such:
- MyLinkedList* obj = new MyLinkedList();
- int param_1 = obj->get(index);
- obj->addAtHead(val);
- obj->addAtTail(val);
- obj->addAtIndex(index,val);
- obj->deleteAtIndex(index); */