【发布时间】:2016-03-15 07:39:36
【问题描述】:
我需要打印出链表中的节点数。我的老师说链表会跟踪它的数据并“知道”其中有多少个节点。所以,我不应该需要一个 while 循环来确定链表的大小。除了 while 循环之外,我很难找到打印大小的方法。
这是链表:
template <class T>
class LinkedList
{
private:
struct ListNode
{
T data ;
struct ListNode * next;
};
ListNode *head;
public:
LinkedList() { head = nullptr; }
~LinkedList();
// Linked list operations
void insertNode(T);
bool deleteNode(T);
void displayList() const;
};
/////////// Implementation portion of linked list with template //////////////
// displayList: print all list data
template <class T>
void LinkedList<T>::displayList() const
{
ListNode * ptr = head;
while (ptr != nullptr)
{
cout << ptr->data << endl;
ptr = ptr->next;
}
}
// insertNode: add a node in list order
template <class T>
void LinkedList<T>::insertNode(T newValue)
{
ListNode *newNode;
ListNode *pCur;
ListNode *pPre = NULL;
newNode = new ListNode;
newNode->data = newValue;
newNode->next = nullptr;
if (head == nullptr)
{
head = newNode;
}
else
{
pCur = head;
pPre = nullptr;
while (pCur != nullptr && pCur->data < newValue)
{
pPre = pCur;
pCur = pCur->next;
}
if (pPre == nullptr)
{
head = newNode;
newNode->next = pCur;
}
else
{
pPre->next = newNode;
newNode->next = pCur;
}
}
}
// deleteNode: delete a node if found
template <class T>
bool LinkedList<T>::deleteNode(T toBeDeleted)
{
ListNode *pCur;
ListNode *pPre;
if (!head)
return true;
pCur = head;
pPre = NULL;
while (pCur != NULL && pCur->data < toBeDeleted)
{
pPre = pCur;
pCur = pCur->next;
}
if (pCur != NULL && pCur->data == toBeDeleted)
{
if (pPre)
pPre->next = pCur->next;
else
head = pCur->next;
delete pCur;
return true;
}
return false;
}
// destructor, delete all nodes
template <class T>
LinkedList<T>::~LinkedList()
{
ListNode *ptr = head;
while (ptr != NULL)
{
head = head->next;
delete ptr;
ptr = head;
}
}
【问题讨论】:
-
这取决于你的链表是如何实现的。如果它跟踪节点的数量,那么您不需要循环。如果没有,那么您别无选择,只能遍历所有节点。由于您没有展示实现,我们无法提供答案。
-
一种选择是以某种方式在每个节点上存储一个计数。然后你只需要访问尾部来找出有多少节点。但这会使添加和删除等操作复杂化。
-
您的老师所说的仅适用于他想到的某些特定实现。有很多人不这样做。你需要问他他在谈论什么实现,或者如果他已经告诉过你,请查看你的讲义。
-
如果列表“知道”它包含多少个节点,答案是询问它包含多少个节点。
标签: c++ while-loop linked-list size