【发布时间】:2014-02-24 00:27:46
【问题描述】:
我一直在尝试将一个项目添加到链接列表的末尾。我想我已经掌握了这个概念,但我在实现代码时遇到了困难。特别是能够遍历链表并找到尾部。这是我到目前为止所拥有的。我已经有一段时间尝试不同的事情了。任何帮助将不胜感激。
##include <iostream>
using namespace std;
class node
{
public:
int data;
node *next;
};
class linkedList
{
private:
node* ptrHead;
node* ptrTail;
int size;
public:
linkedList(); //default constructor
void display();
void addFront(int);
void removeFront();
void addBack(int);
void removeBack();
};
//default constructor
linkedList::linkedList(){
size = 0;
ptrHead = ptrTail = NULL;
}
//display linked list
void linkedList::display(){
node* current = ptrHead;
while (current != NULL) {
cout << current->data << " "; //display current item
current = current->next; //move to next item
}
cout << size;
}
//add item to front of linked list
void linkedList::addFront(int addData){
node* n = new node;
n->next = ptrHead;
n->data = addData;
ptrHead = n;
size++;
}
//remove item from front of linked list
void linkedList::removeFront(){
node* n = ptrHead;
ptrHead = ptrHead->next;
delete n;
size--;
}
void linkedList::addBack(int addData){ ////work in progress
node* n = new node; //create new node
n->data = addData; //input data
n->next = NULL; //set node to point to NULL
if ( ptrTail == NULL ) // or if ( ptrTail == nullptr )
{
ptrHead = n;
ptrTail = n;
}
else
{
ptrTail->next = n;
ptrTail = n;
}
size++;
}
//this is the test code from my main function
int main()
{
//test code
linkedList list;
list.addFront(40);
list.addFront(30);
list.addFront(20);
list.addFront(10);
list.addFront(0);
list.addBack(50);
list.addBack(60);
list.display(); //50 60 7 (the 7 is the count/size of the linked list)
cout << endl;
}
【问题讨论】:
-
这并不能回答您的问题,但您是否考虑过创建双向链表?如果您将 'n->prev' 指针添加到 'node',您将不必在每次将项目添加到列表末尾时遍历整个列表。
-
我还没有学习双向链表。我正在努力向上。不过感谢您的提示。 :)
-
您已经确定了单链表的主要弱点。在一些非常具体的场景中,以线性方式从头到尾遍历完美地模拟了所需的功能。例如,除非您添加退出条件来中断循环,否则 foreach 块将如何从头到尾处理每个语句。双向链表的工作原理相同,但包含双向的引用和指针。它增加了更多开销,但在某些特定情况下很有用,就像单链表一样。
标签: c++ insert linked-list traversal