leetcode707-设计链表
代码部分
#include<iostream>
using namespace std;
class MyLinkedList {
public:
MyLinkedList() {
//空表,仅仅含有头结点
head = new LNode(0,NULL);
}
int get(int index) {
LNode* p = head->next; //初始化,p指向第一个元素结点
int k = 0; //用于计数
while (p && k < index) { //p指向第i个元素结点或p为空退出循环
p = p->next;
k++;
} //循环退出的条件为k=i或达到单链表结尾
if (!p || k > index) return -1; //第index个元素不存在
int e = p->val;
return e;
}
void addAtHead(int val) {
LNode* p=new LNode(val,head->next); //新建结点
head->next = p;
}
void addAtTail(int val) {
LNode* p = head; //利用p进行定位
LNode* temp = new LNode(val, NULL); //要插
while (p->next) { //p指向了最后一个结点
p = p->next;
}
p->next = temp;
}
void addAtIndex(int index, int val) {
LNode* p = head; //p指向头结点
int k = -1; // k为计数器
while (p && k < index - 1) { //直到p指向第i-1个或p为空
p = p->next;
k++;
}
if (!p || k > index - 1) return; //无法插入
LNode* s = new LNode(val, p->next); //新建结点
p->next = s;
}
void deleteAtIndex(int index) {
LNode* p = head; //p指向头结点
int k = -1; //k为计数器
while (p->next && k < index - 1) { //查找被删除结点的前驱
p = p->next;
k++;
}
if (!(p->next) || k > index - 1) return;
LNode* q = p->next; //令q指向待删除的结点
p->next = q->next;
}
void print() {
LNode* p = head->next;
while (p) {
cout << p->val << " ";
p = p->next;
}
cout << endl;
}
private:
struct LNode {
int val;
struct LNode* next;
LNode(int x,LNode* node) {
val = x;
next = node;
}
};
LNode* head;
};
//测试过程
int main() {
MyLinkedList* l = new MyLinkedList();
l->print();
l->addAtHead(1);
l->print();
l->addAtTail(3);
l->print();
l->addAtIndex(1, 2);
l->print();
l->get(1);
l->print();
l->deleteAtIndex(1);
l->print();
}