目录
1.什么是带头双向链表
带头双向链表表示的就是一个有着双向指针的链表既能通过当前位置找到上一个数据的地址也可以找到下一个数据的地址;即是一个有着两个指针的结构体;而那个头就是head(为哨兵位),哨兵位不存储数据,它的作用是能够将头尾链接起来。
双向链表大致结构如图:但其中head哨兵位的头节点存储的是最后一个数据(如果链表为空的话则指向自己),最后一个数据的尾节点指向哨兵位;
2.怎么创建带头双向指针
typedef int LTDataType;
typedef struct ListNode
{
LTDataType data;
struct ListNode* next;
struct ListNode* prev;
}ListNode;
带头双向指针的结构类型。
3.代码实现部分(增、删、查、改)
1.双向链表的初始化
ListNode* ListCreate()// 创建返回链表的头结点.
{
ListNode* pHead = (ListNode*)malloc(sizeof(ListNode));
if (pHead == NULL)
{
perror("malloc fail");
exit(-1);
}
pHead->next = pHead;
pHead->prev = pHead;
return pHead;
}
直接创建一个头节点让节点的头和尾都指向自己就初始化完成了;
2.双向链表的头插
void ListPushFront(ListNode* pHead, LTDataType x)
{
assert(pHead);
ListNode* tail = pHead->next;
ListNode* cur = BuyListNode(x);
cur->prev = pHead;
pHead->next = cur;
tail->prev = cur;
cur->next = tail;
}
3.双向链表的头删
void ListPopFront(ListNode* pHead)
{
assert(pHead);
ListNode* next = pHead->next->next;
ListNode* cur = pHead->next;
next->prev = pHead;
pHead->next = next;
free(cur);
cur = NULL;
}
4.双向链表的尾插
void ListPushBack(ListNode* pHead, LTDataType x)
{
assert(pHead);
ListNode* tail = pHead->prev;
ListNode* cur = BuyListNode(x);
cur->next = pHead;
cur->prev = tail;
pHead->prev = cur;
tail->next = cur;
}