c++的链表结构是基于结构体创建的,下面结构来存放每个节点
struct ListNode
{
double value;
ListNode *next;
};
在已经声明了一个数据类型来表示结点之后,即可定义一个初始为空的链表,方法是定义一个用作链表头的指针并将其初始化为 nullptr,示例如下:
ListNode *head = nullptr;
现在可以创建一个链表,其中包含一个结点,存储值为 12.5,如下所示:
head = new ListNode; //分配新结点
head->value = 12.5; //存储值
head->next = nullptr; //表示链表的结尾
接下来再看一看如何创建一个新结点,在其中存储 13.5 的值,并将其作为链表中的第二个结点。可以使用第二个指针来指向新分配的结点(其中将存储 13.5 的值),示例如下:
ListNode *secondPtr = new ListNode;
secondPtr->value = 13.5;
secondPtr->next = nullptr; //第二个结点是链表的结尾
head->next = secondPtr; //第一个结点指向第二个
用这样的方法创建新节点很麻烦,所以请看下面的代码
struct ListNode
{
double value;
ListNode *next;
//构造函数
ListNode(double valuel, ListNode *nextl = nullptr)
{
value = value1;
next = next1;
}
};
通过该声明,即可使用以下两种不同的方式创建一个结点:
-通过仅指定其 value 部分,而后继指针则默认为 nullptr。
-通过指定 value 部分和一个指向链表下一个结点的指针。
当需要创建一个结点放在链表的末尾时,第一种方法是很有用的;
而当新创建的结点将被插入链表中间某个有后继结点的地方时,第二种方法是很有用的。
通过这个新的结点声明,即可使用比以前的示例要短得多的代码,创建一个存储值 12.5 的结点,而它的后面则是一个存储值 13.5 的结点,示例如下:
ListNode *secondPtr = new ListNode(13.5);
ListNode *head = new ListNode(12.5, secondPtr);
实际上,还可以放弃第二个指针,将上面的代码改写为以下形式:
ListNode *head = new ListNode(13.5);
head = new ListNode(12.5, head);
该语句之所以能和它前面的语句等效,就是因为以下赋值语句:
head = new ListNode(12.5, head);
该语句将从右到左评估,首先在构造函数中使用 head 的旧值,然后从 new 运算符返回的地址将被分配给 head,成为它的新值。
内存释放:
因为是使用new创建的,所以要注意内存释放的问题
void releaseNode(ListNode* node)
{
//创建临时节点
ListNode* temp = NULL;
if(node == NULL)
{
cout << "链表节点内存为空\n";
}
else
{
while(node != NULL)
{
temp = node;
node = node ->next;
delete temp;
cout << "节点内存清除成功\n";
}
}
}