目录
概念
用链表来表示一个线性表,表中的元素是非连续的。
顺序存储方式在插入和删除操作上效率较低(O(n)),而链式存储方式在这些操作上效率更高(O(1));但顺序存储在随机访问、空间利用率和缓存性能方面具有优势。
在具有头结点的链式存储结构中,头指针指向链表的头结点(而非第一个元素结点),第一个元素结点由头结点的指针域指向。
带头结点的单循环链表中,任一结点的后继结点的指针域均不空。
在双向链表中,可以从当前结点出发访问到任何一个结点。
对单链表来说,只有从头结点开始才能访问到表中所有结点。
线性表L如果需要频繁地进行不同下标元素的插入、删除操作,此时选择链式存储结构更好。
线性表采用链表存储时,结点和节点内部的存储空间可以是不连续的。
在一个设有头指针和尾指针的单链表中,执行删除最后一个元素的操作需要从头遍历找到尾节点的前驱节点,因此时间复杂度为 O(n),与链表长度有关。
线性表若采用链式存储结构时,要求内存中可用存储单元的地址连续或不连续都可以。
在单链表中,要删除某一指定结点,必须先找到该结点的直接前驱。
对于线性表,在顺序存储结构和链式存储结构中查找第k个元素,其时间复杂性分别是O(1)和O(K)。
单链表又称为线性链表,在单链表上实施插入和删除操作不需移动结点,只需改变结点指针。
在单链表中,增加一个头结点的最终目的是为了方便运算。
链表不具有的特点是随机访问任一元素。
若某线性表最常用的操作是在表头进行插入和删除,则利用哪种存储方式最合适?:单链表
单链表是线性表的链式存储结构。
线性表L在什么情况下适用于使用链式结构实现?:需不断对L进行删除插入
对于一个具有N个结点的单链表,在给定值为x的结点后插入一个新结点的时间复杂度为O(N)。
数据结构反映了数据元素之间的结构关系。单链表是一种非顺序存储线性表。
循环链表的主要优点是在进行插入、删除运算时,能更好的保证链表不断开。
已知单链表A长度为m,单链表B长度为n,若将B连接在A的末尾,在没有链尾指针的情形下,算法的时间复杂度应为O(m)。
不带头节点单链表的表头插入法,为空的判断条件?:L 表示该链表,那么L==NULL 就表示空。
带头节点单链表为空的判断条件?:h->next==NULL
单链表的尾插法:首先要找到尾节点(p->next=NULL),然后p->next=newnode;p=newnode;p
->next=NULL
单链表的头插法:head 是头指针,p是要插入的节点指针,p->next=head->next;head->next=p;
已知单链表中结点* q是结点* p的直接前趋,若在* q与* p之间插入结点*s,则应执行以下(q->link=s; s->link = p; )操作。
在单链表中,指针域为next,要将q所指结点链接到p所指结点之后,其语句序列应为( q->next=p->next; p->next=q; )。
单链表的结点指针域为next,其头结点由指针head指向,则删除第一个数据结点(由指针p指向)的语句序列为(p = head->next; )。
在单链表中,删除 p 所指结点的后继结点,其语句应该为:s = p->next; p->next = s->next;
在循环双链表的p所指的结点之前插入s所指结点的操作:s->next=p;s->prior=p->prior;p->prior->next=s;p->prior=s
在双向链表中,前驱指针为prior,后继指针为next,删除p所指的结点的语句序列为:p->next->prior=p->prior; p->prior->next=p->next;
带表头附加结点的双向循环链表为空的判断条件是头指针L满足条件:L->right==L
对于一非空的不带头结点循环单链表,h和p分别指向链表的头结点、尾结点,则有:p->next==h
代码
建立链表及基本操作