C++链表设计中获取节点值和删除节点的指针初始化区别
1.获取节点值 int get(int index)
代码如下(index从0到size-1):
int get(int index){
if(index<0||index>size-1)
{
return -1;
}
ListNode* cur=dummyNode->next;
while(index--){
cur=cur->next;
}
return cur->val;
}
ListNode * cur = dummyNode->next;
2.删除节点
void delete(int index)
{
ListNode* cur=dummyNode;
if(index<0||index>=size)
{
return ;
}
else{
while(index--)
{
cur=cur->next;
}
ListNode* tmp=cur->next;
cur->next=cur->next->next;
delete tmp;//释放cur->next空间
tmp= NULL;//清空tmp 避免野指针
size--;
}
}
ListNode * cur=dummyNode;
区别
ListNode * cur = dummyNode->next;
ListNode * cur=dummyNode;
两者初始化指针分别指在第0个节点和虚拟头结点处,前者靠后一位。 也就是当index值相同时,delete(int index)里的cur会在index实际指向的前一位。
举例链表:
节点 | dummyNode | a | b | c | d |
---|---|---|---|---|---|
index | - | 0 | 1 | 2 | 3 |
当index=2时,对应c节点:
变量 | 初始值 | 第1次循环 | 第2次循环 | 第3次循环 |
---|---|---|---|---|
index | - | 2 | 1 | 0 |
cur (get (index)) | a | b | c | exit |
cur (delete(index)) | dummyNode | a | b | exit |
可以看到:当循环结束时,cur分别指向了c和b,c就是index对应的节点,获取其值即可;
但是删除节点时,其本质是将index对应的节点跳过去,内存释放即可,所以cur到前一位b停下,连接下一位d即可。