我正在尝试在C ++的链接列表前面添加一个节点。我已经开发了添加到列表末尾的代码,这比我的大脑更容易理解。这是我的代码:
班级
struct ListNode
{
double value;
ListNode *next;
ListNode(double value1, ListNode *next1 = NULL)
{
value = value1;
next = next1;
}
};
ListNode *head; // List head pointer
添加到列表末尾的功能
void LinkedList::add(double number)
{
if (head == NULL)
head = new ListNode(number);
else
{
// The list is not empty
// Use nodePtr to traverse the list
ListNode *nodePtr = head;
while (nodePtr->next != NULL)
nodePtr = nodePtr->next;
// nodePtr->next is NULL so nodePtr points to the last node
// Create a new node and put it after the last node
nodePtr->next = new ListNode(number);
}
}
我只是在绕着所有的指针移动头部以便添加到开头时遇到了很多麻烦。
感谢。
答案 0 :(得分:3)
添加到开头很简单。不要让事情变得更复杂。
ListNode * new_node = new ListNode(number);
if (head == nullptr)
{
head = new_node;
}
else
{
// Make the new node point to the (old) head.
new_node->next = head;
// Make the head pointer point to the new node.
head = new_node;
}
使用铅笔(或笔)和纸张,并在两个案例中逐步绘制指针和节点。
案例1:清单
插入之前:
head --> nullptr
插入后:
+-----+ new_node --> | 25 | +-----+
+-----+ new_node --> | 25 | +-----+ ^ | head -----------+
案例2:非空列表
插入之前:
+-----+ head --> | 36 | +-----+
插入后:
+-----+ new_node --> | 25 | +-----+
+-----+ +-----+ new_node --> | 25 | --> | 36 | +-----+ +-----+ ^ | head ------------------------+
+-----+ +-----+ new_node --> | 25 | --> | 36 | +-----+ +-----+ ^ | head -----------+
Per Remy的评论,以上内容可以简化为:
ListNode * new_node = new ListNode(number);
// Make the new node point to the (old) head.
new_node->next = head;
// Make the head pointer point to the new node.
head = new_node;
或者简单地说:
// Make the new node point to the (old) head, and
// make the head pointer point to the new node.
head = new ListNode(number, head);
答案 1 :(得分:1)
添加到开头比在最后执行更简单。
您需要将新节点的尾部设置为当前头部,并将头部设置为新节点。
head = new ListNode(number, head);
就是这样。