我正在尝试删除第N个位置的节点。出于某种原因,当尝试移除头部时,函数会在previous->next = current->next
处出错。我已经尝试添加条件来检查是否previous->next != NULL
,但这不起作用。任何人都可以暗示我做错了什么以及如何解决这个问题?感谢。
void removeNth(List** myList, int n) {
Node* previous;
Node* current;
int count;
if (getLength(*myList) >= n) {
if (getLength(*myList) == n) {
removeLast(myList);
}
else {
previous = NULL;
current = *myList;
count = 1;
while (count < n) {
previous = current;
current = current->next;
count++;
}
previous->next = current->next;
freeNode(current);
}
}
}
答案 0 :(得分:0)
这可能会有所帮助。
void removeNth(List ** myList,int n) {
Node* previous;
Node* current;
int count;
if(n==1 && getLength(*myList)>=1) // This small change for deletion at beginning
{
*myList=(*myList)->next;
return;
}
else if (getLength(*myList) >= n)
{
if (getLength(*myList) == n) {
removeLast(myList);
}
else {
previous = NULL;
current = *myList;
count = 1;
while (count < n) {
previous = current;
current = current->next;
count++;
}
previous->next = current->next;
freeNode(current);
}
}
}
答案 1 :(得分:0)
从我看到的所有内容来看,List
只是Node
的别名。鉴于此,您有一个似乎是单向前链接的列表,并且给定一个头指针和一个计数n
,想要删除基于1的位置节点(如果它存在)。
任务
指向头指针并实现它所拥有的指针(一个指针的地址)是使这个算法比你做得更简单的原因。最初它保存指向列表中第一个节点的指针的地址(如果列表为空,则为NULL)。从那里你需要沿着列表向下走,将next
指针的地址存储在你所采用的每一跳的当前节点中。当你到达你的计数器限制时,如果它仍然指向列表中某些next
的指针,那么该指针指向你的受害节点(可能是头节点,但是它没有真的很重要)。您只需将该指针连接到以下节点,然后删除现在的孤立项。
守则
我删除了List
别名,因为我真的认为没有任何意义。如果您使用包含List
和head
指针的tail
结构来获得更快的结尾插入,那么它会更有意义,但我看到您的任何代码中都没有这样的提示是这样的。事实上,除非current = *myList;
和List
是同义词,否则Node
根本不起作用。
void removeNth(Node** pp, unsigned int n)
{
// we're 1-based positioned, so leave early on a value of zero.
// for 0-based positioning delete these two lines.
if (n-- == 0)
return;
// walk the list until (a) we run out of nodes, or (b) meet our count.
while (*pp && n--)
pp = &(*pp)->next; // save address of current node's next ptr
// if this is still non-null, it means we have a prospect to free
if (*pp)
{
Node *node = *pp; // remember node we're about to orphan
*pp = node->next; // wire up next node to where that came from
freeNode(node); // now free the orphaned node
}
}
我强烈建议您仔细阅读并在调试器下运行,逐步检查变量(及其地址),以便更好地了解它的工作原理。