一 定义
单循环链表是一种特殊的链表形式,尾部节点的指针域指向首个节点而不是空,以形成循环。
二 结构
data | next |
三 源码
#include <iostream>
typedef struct Node {
int data;
Node* next;
};
Node* initNode() {
Node* node = new Node();
if (!node) {
return node;
}
node->data = 0;
node->next = node;
return node;
}
bool headInsert(Node* head, int value) {
Node* node = new Node();
if (!node) {
return false;
}
node->data = value;
node->next = head->next;
head->next = node;
head->data++;
return true;
}
bool tailInsert(Node* head, int value) {
Node* node = new Node();
if (!node) {
return false;
}
node->data = value;
node->next = head;
Node* currentNode = head->next;
/// while输出的结果是currentNode->next == head
while (currentNode->next != head)
{
// 內部还是对current的处理
currentNode = currentNode->next;
}
currentNode->next = node;
head->data++;
return true;
}
void deleteNode(Node* head, int value) {
Node* preNode = head->next;
Node* currentNode = preNode->next;
while (currentNode->next != head)
{
if (currentNode->data == value) {
preNode->next = currentNode->next;
head->data--;
delete currentNode;
break;
}
preNode = currentNode;
currentNode = currentNode->next;
}
}
void printNode(Node* head) {
Node* current = head->next;
/// while输出的结果是currentNode == head
while (current != head)
{
printf("%d ", current->data);
current = current->next;
}
printf("\n");
}
int main()
{
Node* node = initNode();
printNode(node);
headInsert(node, 1);
headInsert(node, 2);
headInsert(node, 3);
headInsert(node, 4);
tailInsert(node, 5);
deleteNode(node, 2);
printNode(node);
std::cout << "Node Count:" << node->data;
}
四 总结
1 其和普通单链表的差异在于尾部节点的判断
2 循环链表不存在指针域指向为null的问题
3 while的迭代结果是()中条件的反,把next想象成++更容易理解