双向带头循环
头尾相连:最后一个节点的next指向前一个节点,第一个节点的prev指向最后一个节点
代码实现
#include<stdio.h>
typedef int NodeDataType;
//节点
typedef struct ListNode{
NodeDataType data;
ListNode* next;//指向下一个节点
ListNode* prev;//指向前一个节点
}ListNode;
//链表
typedef struct List{
ListNode* head;//用这个指针指向第一个节点
}List;
ListNode* createNode(NodeDataType val){
ListNode* node=(ListNode*)malloc(sizeof(ListNode))
node->data=val;
node->next=NULL;
node->prev=NULL;
}
viod InitList(List* l1){
if(l1==NULL)
return;
l1->head=createNode(0);//初始化成一个空链表
l1->head->next=l1->head->prev=l1->head;
}
void PushBack(List* l1,NodeDataType val){//尾插,时间复杂度O(1),空链表也照常使用
//先找到最后一个节点
ListNode* last=l1->head->prev;
ListNode* newnode=createNode(val);
last->next=newnode;
newnode->prev=last;
newnode->next=l1->head;
l1->head->prev=newnode;
}
void PopBack(List* l1){
//找到最后一个元素,要是空链表(头的next就是它自己)不用尾删。
if(l1==NULL)
return;
ListNode* last=l1->head->prev;
if(last==l1->head)
return;
else{
}
}
void destory(List* l1){
ListNode* node = l1->head->next;
while (node != l1->head){
ListNode* cur = node->next;
free(node);
node = cur;
}
free(l1->head);
}