今天我们来学习带头双向链表
带头双向循环链表的解释
带头双向链表顾名思义就是:
1、带了一个“头”在数据结构中的意思就是加了一个"哨兵位"。
2、这个链表是双向循环的链表即可以通过任意的节点访问它的上一个和下一个的节点也能通过链表的头直接访问到链表的尾部。
带头双向循环链表的实现
带头双向循环链表的要求和单项循环链表的要求一样:头插,尾插,头删,尾删,查找,打印,前置插入,定点删除,链表销毁等要求要实现。
一、链表的头插
思路解析:
直接找到头结点的下一个,然后把创建的新节点和头结点连上去就行。
代码实现:
void LTPushFront(LTNode* phead, LTDateType x)
{
assert(phead);
LTNode* newnode = GreateLTNode(x);
LTNode* first = phead->next;
phead->next = newnode;
newnode->next = first;
newnode->prev = phead;
first->prev = newnode;
}
二、链表的尾插
思路解析:
直接使用prev的指针找到最后的节点插入并与头结点和倒数第二个节点连接上即可。
代码实现:
void LTPushBank(LTNode* phead, LTDateType x)
{
LTNode* tail = phead->prev;
LTNode* newnode = GreateLTNode(x);
tail->next = newnode;
newnode->prev = tail;
newnode->next = phead;
phead->prev = newnode;
}
三、链表的头删
思路解析:
找到第一个和第二个节点直接把头结点和第二个节点直接连接起来最后free第一个节点即可。
代码实现:
void LTPopFront(LTNode* phead)
{
assert(phead);
assert(phead->next != phead);
LTNode* cur = phead->next->next;
LTNode* tail = phead->next;
phead->next = cur;
cur->prev = phead;
free(tail);
tail = NULL;
}
四、链表的尾删
思路解析:
找到倒数第二个节点然后直接连接到头结点,free最后一个节点即可。
代码实现:
void LTPopBank(LTNode*phead)
assert(phead);
assert(phead->next != phead);
LTNode* tail = phead->prev;
LTNode* tailprev = tail->prev;
free(tail);
tailprev->next = phead;
phead->prev = tailprev;
}
剩下的几个接口我们会在明天继续完成,如有错误还请大佬们敬请指出,谢谢大家的关注谢谢。