链表常见的定义与原理,这里不再赘述,不懂的可以去自己搜搜,这里主要记录常见的两种链表的实现方式,也就是动态链表与静态链表。
一、动态链表与静态链表
动态链表就是我们常见的用结构体实现的链表,因为结构体的内存分是动态的(只有的被定义时才会分配内存),所以在运行时会根据需要动态的分配内存,在实际应用开发中应用较多,但在运行时动态的分配内存,会占据大量的时间,但在做一些算法题时,会有时间限制,所以就需要静态链表一次性申请内存(动态链表也可以但实现有些麻烦)。
1、动态链表
typedef struct Node {
int data ;
Node* next;
}List,*ListLink;
//创建链表
int main()
{
ListLink head = NULL, q = NULL, m = NULL;
head = new (List);
head->data = 0;
head->next = NULL;
q = head;
char a[] = "hello";
int n = sizeof(a) / sizeof(a[0]);
for (int i = 0; i < n; i++)
{
ListLink p = new(List);
p->data = a[i];
p->next = NULL;
q->next = p;
q = p;
}
m = head ->next;
while (m)
{
cout << m->data << " ";
m = m->next;
}
return 0;
}
//插入操作
//在第k个位置插入
void add(ListLink head, int k, char a)
{
if(head == NULL || k <= 0 )
{
return ;
}
ListLink p;
p = head->next ;
ListLink list1 = new List;
list1->data = a;
list1->next = NULL;
while (p && k-1)
{
k--;
p = p->next;
}
list1->next = p->next;
p->next = list1;
}
=
//删除操作
//删除第k个字符
void earse(ListLink head , int k)
{
ListLink p = NULL , q = NULL;
p = head->next;
while (p->next && k - 2)
{
k--;
p = p->next;
}
q = p->next;
p->next = q->next;
delete q;
q = NULL;
}
//反转链表
void reverse(ListLink head)
{
if(head == NULL )
{
return;
}
ListLink beg = NULL, end = NULL;
beg = head->next;
end = beg->next;
while (end)
{
beg->next = end->next;
end->next = head->next;
head->next = end;
end = beg->next;
}
}
//排序在下一篇博客一起总结
2.静态链表
#include <iostream>
using namespace std;
int const N = 100010;
int head, idax, da[N] , ne[N] ;
void init () //初始化
{
head = -1;
idax = 0;
}
void add_to_head( int x )//头插法
{
da [ idax ] = x;
ne [ idax ] = head;
head = idax ++;
}
void add_to_k( int k , int x )//在第k个后插入
{
da[ idax ] = x;
ne[ idax ] = ne[ k ];
ne[ k ] = idax ++;
}
void remove( int k )//删除操作
{
ne[ k ] = ne [ne[k] ];
}
//输出
for(int i = head ; i != -1 ; i = ne[i]) cout << da[i] << ' ' ;
cout << endl ;