这道题虽然是中等题,但是都是链表的基本操作,是一些基础的内容。
首先定义一个节点:
struct LinkedList {
int val;
LinkedList* next;
LinkedList(int val):val(val), next(nullptr){};
};
然后对于getindex,只需要用一个循环使链表向后移动i次就好,
int get(int index) {
LinkedList *cur=head;
while(cur && index > 0){
cur = cur->next;
index--;
}
if(cur) return cur->val;
else return -1;
}
在链表头添加,只需要创建节点,然后将它接在链表前面就好;
void addAtHead(int val) {
LinkedList* newHead = new LinkedList(val);
newHead->next = head;
head = newHead;
}
在尾部添加首先判断是否为NULL,如果是直接创建节点就符合要求,否则就不断遍历到链表尾部,然后链上新节点就好
void addAtTail(int val) {
LinkedList* cur = head;
LinkedList* newNode = new LinkedList(val);
if (head == nullptr) {
head = newNode;
return;
}
while (cur->next) {
cur = cur->next;
}
cur->next = newNode;
}
在index出插入节点,除去特殊情况,只需要找到目标节点的前驱节点即可
void addAtIndex(int index, int val) {
LinkedList *node=new LinkedList(val);
//1、index小于等于0,直接在头部插入节点
if(index <= 0)
{//若index小于等于0,我们仅需要在头节点前面插入新节点就行了
node->next=head;
head=node;
return;
}
LinkedList *cur = head;
//在索引为index的节点之前插入新节点,我们需要找到它的前驱节点,然后插入在它的前驱节点后面
while(cur && 1 < index)
{
cur = cur->next;
index--;
}
//2、cur为索引节点的前驱节点
if(cur)
{
node->next = cur->next;
cur->next = node;
}
}
删除index处的节点也类似,只需要找到前驱节点,然后删除就好。
void deleteAtIndex(int index) {
//1、index为0,我们直接删除head节点
if(index == 0&& head != nullptr)
{
LinkedList *del = head;
head = head->next;
delete del;
return;
}
LinkedList* p = head;
//删除索引为index的节点,我们需要找到它的前驱节点p,p->next为需要删除节点
while(p && index > 1)
{
p = p->next;
index--;
}
//2、index超过链表范围,删除失败
if(!p)return;
//3、index的位置合法,我们找到需要删除的p->next节点
if(p->next)
{
LinkedList *del = p->next;
p->next = del->next;//删除节点
delete del;
}
}
综上所述:
全部代码:
class MyLinkedList {
public:
struct LinkedList {
int val;
LinkedList* next;
LinkedList(int val):val(val), next(nullptr){};
};
LinkedList* head;
MyLinkedList():head(nullptr) {}
int get(int index) {
LinkedList *cur=head;
while(cur && index > 0){
cur = cur->next;
index--;
}
if(cur) return cur->val;
else return -1;
}
void addAtHead(int val) {
LinkedList* newHead = new LinkedList(val);
newHead->next = head;
head = newHead;
}
void addAtTail(int val) {
LinkedList* cur = head;
LinkedList* newNode = new LinkedList(val);
if (head == nullptr) {
head = newNode;
return;
}
while (cur->next) {
cur = cur->next;
}
cur->next = newNode;
}
void addAtIndex(int index, int val) {
LinkedList *node=new LinkedList(val);
//1、index小于等于0,直接在头部插入节点
if(index <= 0)
{//若index小于等于0,我们仅需要在头节点前面插入新节点就行了
node->next=head;
head=node;
return;
}
LinkedList *cur = head;
//在索引为index的节点之前插入新节点,我们需要找到它的前驱节点,然后插入在它的前驱节点后面
while(cur && 1 < index)
{
cur = cur->next;
index--;
}
//2、cur为索引节点的前驱节点
if(cur)
{
node->next = cur->next;
cur->next = node;
}
}
void deleteAtIndex(int index) {
//1、index为0,我们直接删除head节点
if(index == 0&& head != nullptr)
{
LinkedList *del = head;
head = head->next;
delete del;
return;
}
LinkedList* p = head;
//删除索引为index的节点,我们需要找到它的前驱节点p,p->next为需要删除节点
while(p && index > 1)
{
p = p->next;
index--;
}
//2、index超过链表范围,删除失败
if(!p)return;
//3、index的位置合法,我们找到需要删除的p->next节点
if(p->next)
{
LinkedList *del = p->next;
p->next = del->next;
delete del;
}
}
};
/**
* 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);
*/