在这里,我只是想打印我创建的链接列表中的元素,但它是以反向顺序打印的,看起来代码中存在一个错误,帮助我解决它push函数每次我们输入元素插入链接列表时都会向链接列表添加节点,我已经传递了头和数据的参考。每次调用push函数时,都会动态创建一个节点。我在这里使用的是C++语言。
#include<iostream>
using namespace std;
class node{
public:
int data;
node* next;
};
//creating linked list
void push(node** head_ref,int new_data) //passing address of head and data to put in list
{
node* new_node=new node(); //new node created
new_node->data=new_data; //data inserted
new_node->next=*(head_ref);
*(head_ref)=new_node;
}
int main()
{
node* head=NULL;
int n;
cin>>n; //number of elements in linked list
for(int i=0;i<n;i++)
{
int val;
cin>>val;
push(&head,val); //push function which creates a linked list
}
//while loop for printing elements of linked list
while(head!=NULL)
{
cout<<head->data;
head=head->next;
}
return 0;
}
你目前所做的是将每个节点指定为当前头部的前身,所以最终你的头部将是你添加的最新元素,它的继承者是最后的第二个元素,它的继承者是最后的第三个元素等等,从而导致一个反向的列表。
你应该将新的节点分配为 继承者 的当前 "头",像这样。
void push(node** tail_ref,int new_data) //passing address of tail and data to put in list
{
node* new_node=new node(); //new node created
new_node->data=new_data; //data inserted
(*tail_ref)->next= new_node;
*(tail_ref)=new_node;
}
请注意,我重命名了 head_ref
到 tail_ref
在上面的代码段中,它更好地描述了指针实际代表的内容:指向列表当前最后一个元素的指针,因此是列表的尾部。
当然,你需要保存指向第一个元素的指针。否则你将无法在你的链接列表中迭代。
扩展到 西蒙的答案,到目前为止是正确的。
你已经有了一个 "节点 "类 - 为什么不创建一个 "列表 "或 "linked_list "类呢?
class LinkedList
{
node* m_head = nullptr;
node* m_tail = nullptr;
};
现在你总是把头和尾结合在一起,而不需要分开存储它们。注意,在上面的例子中,它们都是 私人. 其实你应该这样设计你的类。如果你不这样做,那么你就允许用户从外部破坏列表的实现(例如,有人可能只是将其中一个指针设置为nullptr,在head的情况下产生内存泄漏)。
然而,现在你必须提供适当的手段来访问和修改列表。
class LinkedList
{
public:
void append(int new_data); // as Simon proposed
void prepend(int new_data); // your implementation
int head();
int tail();
void dropHead();
//void dropTail(); // is an O(n) operation with singly linked list, though!
private:
node* m_head = nullptr;
node* m_tail = nullptr;
};
节点类和你的列表有非常紧密的联系,你可以考虑不要让它成为一个独立的类,而是让它成为一个嵌套类。还有相当多的内容需要补充(例如如何在列表上迭代)。要想得到一些提示,我建议偷看一下STL,熟悉一下迭代器的概念。
最后是 不要再重复发明轮子了 STL已经提供了完全实现的双重(std::list
)和单一地(std::forward_list
)链接列表。实验一下自己的实现,了解一下风向,是可以的,但是一旦了解了,就换回STL。