1.存储方式
随机存储
2.链表分类
单链表、双链表、环形链表
3.链表的初始化
1.单链表
struct ListNode{
int val;
ListNode *next;
ListNode(int x):val(x),next(NULL){} //构造函数
};
2.初始化单链表
初始化链表就是为链表的每一个节点申请内存,并将分配next指针。
采用头插法
需要定义链表的头结点,这里用dummyHead作为链表头节点
ListNode *dummyHead = new ListNode(0);
dummyHead ->next=NULL;
首先为需要添加的节点申请内存并赋值
//如果没有定义构造函数,则使用默认构造
ListNode *p = new ListNode();
p->val = 5;
//此处定义了,可以一步初始化
ListNode *p = new ListNode(5);
将节点p加入链表
p->next = dummyHead->next;
dummyHead->next = p;
如此循环添加就好了,注意链表的大小,按需申请内存。
3.链表添加节点,删除节点
class MyLinkedList {
public:
struct ListNode
{
int val;
ListNode *next;
ListNode(int x):val(x),next(NULL){}
};
MyLinkedList() {
dummyHead = new ListNode(0); //虚拟头节点
size=0;
}
int get(int index) {
if(index>(size-1)||index<0) return -1;
ListNode* cur=new ListNode(0);
cur=dummyHead->next;
while(index--)
{
cur=cur->next;
}
return cur->val;
}
void addAtHead(int val) {
ListNode *p = new ListNode(val);
ListNode *cur = dummyHead;
p->next = cur->next;
cur->next = p;
size++;
}
void addAtTail(int val) {
ListNode *cur = new ListNode(0);
ListNode *p = new ListNode(val);
cur = dummyHead;
while(cur->next)
{
cur=cur->next;
}
cur->next = p;
size++;
}
void addAtIndex(int index, int val) {
if(index>size) return;
if(index<0) index=0;
// if(index == size) addAtTail(val);
if(index<=size) //这次错误原因,这里少了等于
{
ListNode *cur=new ListNode(0);
cur=dummyHead;
while(index--)//找到index的前一个节点
{
cur=cur->next;
}
ListNode *p= new ListNode(val);
p->next= cur->next;
cur->next = p;
size++;
}
//正确的如下
// if(index > size) return;
// if(index < 0) index = 0;
// ListNode* newNode = new ListNode(val);
// ListNode* cur = dummyHead;
// while(index--) {
// cur = cur->next;
// }
// newNode->next = cur->next;
// cur->next = newNode;
// size++;
}
void deleteAtIndex(int index) {
if(index>=size||index<0) return ;
ListNode *cur= new ListNode(0);
cur = dummyHead;
while(index--)//被删除下标的前一个节点
{
cur = cur->next;
}
cur->next=cur->next->next;
size--;
}
void printf(ListNode *head)
{
while(head)
{
cout<<head->val;
head = head->next;
}
}
ListNode *dummyHead;
int size;
};
/**
* 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);
*/
双链表方法
class MyLinkedList {
public:
struct ListNode{
int val;
ListNode* prev;
ListNode* next;
ListNode(int x):val(x),next(NULL),prev(NULL){}
};
MyLinkedList() {
dummyHead = new ListNode(0);
size=0;
}
int get(int index) {
if(index>(size-1)||index<0) return -1;
ListNode *cur = new ListNode(0);
cur = dummyHead->next;
while(index--)
{
cur = cur->next;
}
return cur->val;
}
void addAtHead(int val) {
ListNode *p = new ListNode(val);
p->next = dummyHead->next;
p->prev = dummyHead;
dummyHead->next = p;
size++;
}
void addAtTail(int val) {
ListNode *cur = dummyHead;
ListNode *p = new ListNode(val);
while(cur->next)
{
cur = cur->next;
}
p->prev = cur;
cur->next = p;
size++;
}
void addAtIndex(int index, int val) {
if(index>size) return;
// if(index==size) addAtTail(val);
if(index<=size)
{
ListNode *p = new ListNode(val);
ListNode *cur = dummyHead;
while(index--)
{
cur = cur->next;
}
if(cur->next == NULL)
{
p->prev = cur;
cur->next=p;
}
else
{
cur->next->prev = p;
p->next = cur->next;
p->prev = cur;
cur->next = p;
}
size++;
}
}
void deleteAtIndex(int index) {
if(index<0||index>=size) return;
ListNode *cur = dummyHead;
while(index--)
{
cur = cur->next;
}
if(cur->next->next==NULL)
{
ListNode *temp = new ListNode(0);
temp = cur->next;
cur->next->prev = temp;
cur->next = cur->next->next;
delete(temp);
}
else
{
ListNode *temp = new ListNode(0);
temp = cur->next;
cur->next->prev = temp;
cur->next->next->prev = cur;
cur->next = cur->next->next;
delete(temp);
}
size--;
}
int size;
ListNode *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);
*/