该文中假设链表的头结点为plist
后继结点为->next
前驱结点为->prior
单链表:
①判空条件:plist==NULL 头节点等于NULL
②初始化:plist->next=NULL
循环链表:
①判空条件为:plist->next == plist; 头结点的下一个结点是头结点
②初始化:plist->next=plist;//头尾相连
②判断结尾不同:循环链表的结尾又回到了头(是一个圈圈一样的循环):p==plist;而单链表的结尾时NULL:p==NULL。
③循环链表可以从一个结点到达任意节点,而单链表只能顺着链表一直查找下去(因为循环链表可以一直循环下去,而单链表只能走一遍)。
双向链表:
增加了前驱结点,在涉及前驱结点的头插、尾插、删除操作上有所不同。
①判空条件plist==NULL.
①头插与尾插的最后一部插入时,需要把前驱结点连接上,头插法:p->prior=plist;p->next->prior=p;其中p->next可能为NULL,需要对其if判断操作。(如图所示)
②尾插法直接连接:p->prior = q;
③删除某节点操作中,不仅需要改变该结点前驱的后继指向(p->prior->next=p->next; ),也需要删除该节点后继的前驱指向(p->next->prior=p->prior;),该前驱仍然涉及p->next可能为NULL,因此增加if判断语句(如图所示)。
具体执行代码请参照:
单链表:
【链表】单链表知识总结-内含代码操作及其说明_又秃又弱的博客-CSDN博客_单链表知识总结
循环链表:
【链表】循环链表知识点-内含代码基本操作及其说明_又秃又弱的博客-CSDN博客_循环链表的基本操作
双向链表:
双向链表知识点-内含基本操作及其说明_又秃又弱的博客-CSDN博客_双向链表前插操作核心代码可以交换先后位置吗?
在链表代码实现角度:
单链表和循环链表的头插法是一样的,因为头插不需要考虑尾结点的情况,只需要在头部插入,而循环链表和单链表的不同就是尾结点指向头结点(形成循环),因此,头插法的实现都一样。
尾插法也一样,单链表的尾巴=NULL,循环链表的尾巴=头节点plist。在尾插时,都是把新结点->next=尾->next,尾->next=新节点。
....所有实现代码中不同的就是循环条件:
单链表for(Node*p=plist;p->next!=NULL;p=p->next);
循环链表:for(Node* p=plist;p->next!=plist;p=p->next);
而双向链表:只有涉及到前驱的头插、尾插、删除、函数需要修改,别的函数与单链表写法一致