循环双向链表插入后返回新节点指针及操作位置维护咨询
循环双向链表:插入后指针指向控制与位置维护方案
嘿,你的需求完全可以实现!先直接回答你的核心问题:当然能让返回的指针指向新插入的节点,而不是原起始节点,而且维护一个跟踪增删位置的指针也很简单,结合你给出的代码,我来一步步拆解说明。
一、实现插入后指针指向新节点
其实逻辑很直白:在完成插入操作后,直接把你传入的指针变量更新为新节点的地址就行。比如你想在某个节点后插入新节点,插入完成后让原指针指向这个新节点,只需要加一行代码就搞定了。
不过先得修正你代码里insertAndMove方法的几个bug,不然插入逻辑本身就跑不通:
- 条件判断写错了:
if((*POS)->next = NULL)这里是赋值=不是判断相等==,而且循环双向链表里根本不会有next为NULL的情况(因为是闭环的),这个条件完全可以删掉。 - 节点指针绑定逻辑错误:你原来的代码会把新节点的
next指向自己,这就破坏了链表结构。正确的做法是先保存原节点的后继,再逐个绑定指针。 - 指针移动的逻辑本身是对的,只是需要放在正确的位置。
修正后的insertAndMove方法(支持指向新节点)
如果插入后你想让指针直接指向新节点,修改后的代码是这样的:
void insertAndMove(List_node** POS){ int c = (*POS)->value; List_node* newNode = new List_node; newNode->value = c-1; // 正确插入新节点到当前POS之后 List_node* oldNext = (*POS)->next; // 先保存原后继节点 (*POS)->next = newNode; newNode->prev = *POS; newNode->next = oldNext; oldNext->prev = newNode; // 直接让指针指向新插入的节点(如果不需要移动c次的话) *POS = newNode; // 如果需要按原需求移动c次,就注释掉上面一行,保留下面的循环 // for(int i = 0; i < c; i++){ // *POS = (*POS)->next; // // cout <<"POS: " << (*POS)->value << endl; // 调试用 // } }
这样调用insertAndMove(&list)之后,list指针就会指向新插入的节点,而不是原来的起始节点。
二、维护“实际位置”指针的方案
如果你的场景是需要频繁在某个动态变化的位置做增删,最稳妥的方式是单独维护一个专用指针,用来标记当前的操作位置,而不是依赖链表的起始节点指针。比如在main函数里:
int main(){ int numberOfOperations = getNumber(); struct List_node* list = NULL; while(!feof(stdin)){ int number = getNumber(); insert(&list, number); } // 初始化实际位置指针,比如指向起始节点 struct List_node* currentOperatePos = list; // 操作时传入这个专用指针的地址 insertAndMove(¤tOperatePos); // 此时currentOperatePos就是你要的标记位置 cout << currentOperatePos->value << endl; }
这个currentOperatePos就专门用来跟踪你需要操作的“实际位置”,每次增删操作都基于它进行,操作完成后根据需求更新它的指向(比如指向新插入的节点,或者移动后的节点),完全和链表的起始节点解耦。
额外小提示
- 记得在程序结束时释放链表的内存,避免内存泄漏,可以写一个遍历释放的函数:
void destroyList(List_node* start){ if(start == NULL) return; List_node* current = start->next; while(current != start){ List_node* temp = current; current = current->next; delete temp; } delete start; }
- 你的
insert方法逻辑是对的,空链表时让节点自闭环,没问题。
内容的提问来源于stack exchange,提问作者dominosam
相关产品推荐
相关产品推荐

