正在链接列表前面添加节点
Adding node in front of linklist
我已经实现了如下链接列表,
struct node
{
int data;
node* next;
};
void initNode(node* head, int data)
{
head->data = data;
head->next = NULL;
}
void addNode(node* linkList, int data)
{
node* newnode = new node;
newnode->data = data;
newnode->next = NULL;
while (linkList)
{
if (linkList->next == NULL)
{
linkList->next = newnode;
return;
}
linkList = linkList->next;
}
}
void insertFrontNode(node* linkList, int data)
{
node* newnode = new node;
newnode->data = data;
newnode->next = linkList;
linkList = newnode;
}
void DisplayLinkList(struct node* linkList)
{
int i = 1;
while (linkList)
{
cout << "Linklist(" << i << ") " << linkList->data << endl;
linkList = linkList->next;
i++;
}
}
int main()
{
node* linkList =new node;
initNode(linkList, 5);
addNode(linkList, 10);
addNode(linkList, 30);
insertFrontNode(linkList, 12);
DisplayLinkList(linkList);
cin.get();
return 0;
}
我的问题是,当我在initNode中初始化链表或在addNode中添加节点时,这些变化反映在我通过参数传递的linkst指针中。但是,如果我在insertFrontNode中添加node-infront,则更改不会反映在链表指针中。
为什么?区别在哪里?
您可能会发现,在列表周围添加一个列表(slist,单链表)结构会有所帮助(并进行头添加和尾添加O(1)操作)。
struct node
{
int data;
node* next;
};
struct slist
{
node* head;
node* tail;
};
void addHead(slist* linkList, int data)
{
//new list node
node* newnode = new node;
newnode->data = data;
newnode->next = NULL;
newnode->next = linkList->head;
linklist->head = newnode->next;
}
void addTail(slist* list, int data)
{
//new list node
node* newnode = new node;
newnode->data = data;
newnode->next = NULL;
if( list->tail ) {
list->tail->next = newnode;
}
list->tail = newnode;
}
void DisplayLinkList(struct slist* linkList)
{
int i = 1;
node* link = linklist->head;
while (link)
{
cout << "Linklist(" << i << ") " << link->data << endl;
link = link->next;
i++;
}
}
int main()
{
slist* linkList=new slist;
addTail(linkList, 5);
addTail(linkList, 10);
addTail(linkList, 30);
addHead(linkList, 12);
DisplayLinkList(linkList);
return 0;
}
你做得很好。您正在修改链接列表的标题,但没有将其更新到外部世界。因此,当您调用DisplayLinkList时,它是用旧的头指针调用的,这就是为什么更改没有反映出来的原因。检查以下代码:
void insertFrontNode(node** linkList, int data)
{
node* newnode = new node;
newnode->data = data;
newnode->next = *linkList;
*linkList = newnode;
}
int main()
{
node* linkList = new node;
initNode(linkList, 5);
addNode(linkList, 10);
addNode(linkList, 30);
insertFrontNode(&linkList, 12);
DisplayLinkList(linkList);
cin.get();
return 0;
}
在上面的代码中,不仅在前面添加了节点,还更新了头部指针,以便显示函数获得新的更新的头部指针。
相关文章:
- 将树节点添加到向量向量中的 n 元树遍历的平均和最坏情况时间复杂度是多少?
- 在单链表前面添加一个节点后,我无法遍历每个节点
- 如何使用LLVM C++API向保留节点列表添加
- 如何确保我的节点被添加到链接列表中
- 如何将节点添加到链表
- 在 C++ 中使用 temp 变量将节点添加到链表的末尾
- 想要以最新的添加节点完整返回树节点的根
- 在列表末尾添加节点
- 如何在提升property_tree前面添加节点
- C++ & cocos2dx -- 无法以编程方式添加节点
- 链接列表C 类,这两个添加节点实现之间的差异是什么?
- 最后在C++的链表中添加节点
- 在ITH位置添加节点
- 单链表在中间添加节点
- 添加节点时C++二叉搜索树状态访问冲突错误
- boostpropertytree在循环中添加节点
- 正在链接列表前面添加节点
- 向二叉搜索树添加节点
- 程序不读取和添加节点到2双链表c++
- 向链表中添加节点