private int size = 0; private Node<T> head; CircularDoubleLinkedListWithHeadNode() { head = new Node<T>(null, null, null); head.prior = head.next = head; } public boolean isEmpty() {// 判空 return size == 0; } public int size() {//求链表长度 return size; } public void print() { // 输出双向循环链表的所有值 Node<T> p = head.next; // 初始化指针,令p指向首结点 while (p != head) { System.out.print(p.data);// 输出结点 p = p.next;// 指向下一个结点 } }
时间: 2024-04-17 10:27:14 浏览: 15
这段代码定义了一个带头结点的循环双向链表。首先,声明了一个私有变量size来记录链表中的元素个数,以及一个头结点head。
构造函数CircularDoubleLinkedListWithHeadNode()创建了一个空的循环双向链表。它初始化了头结点head,并将head的prior和next指针都指向自身,形成一个空的循环链表。
isEmpty()方法用于判断链表是否为空,即判断size是否为0。
size()方法返回链表中的元素个数,即返回size。
print()方法用于输出整个双向循环链表的值。首先,初始化指针p指向头结点的下一个节点(首结点)。然后,通过循环遍历链表,输出每个节点的值,并将指针p指向下一个节点,直到遍历完整个链表(即p指向头结点)。
这些方法可以用于操作带头结点的循环双向链表的基本功能,包括判断链表是否为空、获取链表长度和输出链表元素。
相关问题
#include <iostream> using namespace std; // 双向链表节点 struct ListNode { int val; ListNode* prev; ListNode* next; ListNode(int x) : val(x), prev(NULL), next(NULL) {} }; // 双向链表类 class LinkedList { public: LinkedList() { head = new ListNode(-1); tail = new ListNode(-1); head->next = tail; tail->prev = head; } // 左插入 void insertLeft(int val) { ListNode* node = new ListNode(val); node->prev = head; node->next = head->next; head->next->prev = node; head->next = node; } // 右插入 void insertRight(int val) { ListNode* node = new ListNode(val); node->prev = tail->prev; node->next = tail; tail->prev->next = node; tail->prev = node; } // 删除节点 void remove(ListNode* node) { node->prev->next = node->next; node->next->prev = node->prev; delete node; } // 显示链表 void display() { ListNode* cur = head->next; while (cur != tail) { cout << cur->val << " "; cur = cur->next; } cout << endl; } private: ListNode* head; // 链表头节点 ListNode* tail; // 链表尾节点 }; int main() { LinkedList list; // 左插入示例 list.insertLeft(1); list.insertLeft(2); list.insertLeft(3); list.display(); // 输出:3 2 1 // 右插入示例 list.insertRight(4); list.insertRight(5); list.insertRight(6); list.display(); // 输出:3 2 1 4 5 6 // 删除示例 ListNode* node = list.head->next; list.remove(node); list.display(); // 输出:2 1 4 5 6 return 0; }严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C2248 “LinkedList::head”: 无法访问 private 成员(在“LinkedList”类中声明) C++ experiment C:\Users\zhoubo\source\repos\C++ experiment\C++ experiment\Calculator.cpp 839
这个错误是因为你试图在类外访问私有成员head,而head是LinkedList类的私有成员,只有类内成员才能访问。如果你需要在类外访问head,可以提供一个公有的访问函数。例如,在LinkedList类中添加如下代码:
ListNode* getHead() {
return head;
}
然后在main函数中,你可以这样使用:
ListNode* node = list.getHead()->next;
这样就可以访问head了。
c++实现:请尝试用模版实现单链表。 包含的函数: void append(T val); // 链尾增加一个元素 void insertElement(int pos, int val); // 在指定位置val后添加一个元素 void deleteElement(T val); // 删除所有值为val的元素 void travalList()const; // 从头节点遍历输出链表
下面是使用模板实现的单链表的代码:
```c
#include <iostream>
using namespace std;
template<typename T>
class Node {
public:
T data;
Node<T>* next;
Node(T data) {
this->data = data;
this->next = NULL;
}
};
template<typename T>
class LinkedList {
private:
Node<T>* head;
public:
LinkedList() {
head = NULL;
}
void append(T val) {
Node<T>* newNode = new Node<T>(val);
if (head == NULL) {
head = newNode;
}
else {
Node<T>* temp = head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
}
}
void insertElement(int pos, int val) {
Node<T>* newNode = new Node<T>(val);
if (pos == 0) {
newNode->next = head;
head = newNode;
}
else {
Node<T>* temp = head;
for (int i = 0; i < pos - 1; i++) {
temp = temp->next;
}
newNode->next = temp->next;
temp->next = newNode;
}
}
void deleteElement(T val) {
Node<T>* temp = head;
Node<T>* prev = NULL;
while (temp != NULL && temp->data == val) {
head = temp->next;
delete temp;
temp = head;
}
while (temp != NULL) {
while (temp != NULL && temp->data != val) {
prev = temp;
temp = temp->next;
}
if (temp == NULL) {
return;
}
prev->next = temp->next;
delete temp;
temp = prev->next;
}
}
void travalList() const {
Node<T>* temp = head;
while (temp != NULL) {
cout << temp->data << " ";
temp = temp->next;
}
cout << endl;
}
};
int main() {
LinkedList<int> list;
list.append(1);
list.append(2);
list.append(3);
list.travalList();
list.insertElement(1, 4);
list.travalList();
list.deleteElement(2);
list.travalList();
return 0;
}
```
这里使用了两个模板类,Node用于定义链表节点,LinkedList用于定义链表。其中,append函数用于在链表尾部添加元素,insertElement函数用于在指定位置后添加一个元素,deleteElement函数用于删除所有值为val的元素,travalList函数用于遍历链表并输出链表元素。