gpt4 book ai didi

c++ - 当它是列表中唯一的节点时删除链表的头部。单链

转载 作者:太空宇宙 更新时间:2023-11-04 12:55:27 26 4
gpt4 key购买 nike

你好,我编写了一个链表类的成员函数来复制偶数节点并删除奇数节点。

在我尝试删除仅包含 1 个元素的列表的头部之前,我的测试用例中的一切都是成功的。

我的测试程序指出,无论出于何种原因,列表的长度都大于零,这是不可能的,因为我明确地将 headPtr 的值设置为 NULL。

void RemOddDupEven(Node*& headPtr)
{
Node *cur = headPtr; // current node is set to head
Node *pred = 0; // predecessor is NULL

if(headPtr == 0) // check for empty list.
return;

// ensures will only run 1 time if there is 1 item in list.

while(cur != 0 && headPtr -> link != 0) // ensure there is a next link and more than 1 node in list.
{

if(cur -> data % 2 == 0) // If the value is even
{
Node *newNode = new Node; // Create a new node
newNode -> data = cur -> data; // Set new Nodes data field
newNode -> link = 0; // set newNode link field to NULL

if(cur == headPtr) // if the current node is the head of the list
{
newNode -> link = headPtr; // link field updated to head
headPtr = newNode; // newNode becomes the new Head of the list
}
else // current node is not the head of the list
{
pred -> link = newNode; // update pred node to point to newNode
newNode -> link = cur; // update newNode to point to current
}

pred = cur; // update the pred node
cur = cur -> link; // update the current node
}


if(cur -> data % 2 == 1) // check if this is odd
{
Node* nextNode = 0; // Declare Next Node and set equal to

if(cur -> link == 0) // if there is no next Node then we are at the end of the list
{
delete cur; // delete the current Node
cur = nextNode;
}
else{ // else there is a next node defined
nextNode = cur -> link; // set the nextNode to point to next in list
delete cur; // delete the current Node
cur = nextNode; // assign the current Node to the next Node
}

if(pred) // if the pred is defined
pred -> link = cur; // previous node point to current node
else
headPtr = cur; // else we're at the head of the list
}
} // end while
} // end method

这是我的列表函数代码

我检查列表长度的函数如下

int listLength(Node* headPtr){ // pass by value
int length = 0;

while(headPtr !=0){
length++;
headPtr=headPtr->link;
}

return length;
}

最佳答案

while(cur != 0 && headPtr -> link != 0)

如果 headPtr 是列表中的唯一节点,那么 headPtr -> link 实际上指向 null,因此检查它并不是解决这种情况的最佳方式。您可以使用一个简单的 else if() 来像这样应用逻辑

 if(headPtr == 0)       // check for empty list.
return;

else if(headPtr -> link == NULL){
// Do some stuff to delete only this node
}

else { // handle as usual
// ensures will only run 1 time if there is 1 item in list.

while(cur != 0 && headPtr -> link != NULL) // ensure there is a next link and more than 1 node in list.
{
// The rest of your code
}
}

关于c++ - 当它是列表中唯一的节点时删除链表的头部。单链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46870764/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com