在学习链表的时候,往链表里添加新节点的时候,会运用到双指针。这是因为考虑到空链表的情况下,所做的一个特殊处理。
这里的空链表画上重点,待会会考
首先附上添加新节点的函数代码:
void Attach(ListNode ** pHead, int value)
{
ListNode * new_Node = new ListNode();
new_Node->val = value;
new_Node->next = NULL;
if (*pHead == NULL)
{
*pHead = new_Node;
}
else
{
ListNode* p = *pHead;
while (p->next != NULL)
{
p = p->next;
}
p->next = new_Node;
}
}
首先我们要明白每个指针都是有属于自身的一个地址,以及指向他人的一个地址 例如:int * p = &a; 我们假设这个空链表的头指针是 L 假设我们现在传入的是空链表的指针(即头指针为空),也就是说传入一个只包含自身地址的指针的地址(即 &L) 所以我们可以通过 *pHead 来修改L指针的指向
如果我们把代码修改成单指针
void Attach(ListNode * pHead, int value)
{
ListNode * new_Node = new ListNode();
new_Node->val = value;
new_Node->next = NULL;
if (pHead == NULL)
{
pHead = new_Node;
}
else
{
ListNode* p = pHead;
while (p->next != NULL)
{
p = p->next;
}
p->next = new_Node;
}
}
我们同样传入的是空链表的指针(即头指针为空),也就是说传入一个只包含自身地址的指针(即 L) 这样的话,虽然在函数过程中pHead指向了新的节点,但是与指针L没有任何的关系。当函数结束后,pHead被释放之后,指针L没有发生任何变化。
但是但是但是! 这里的情况只是针对于空链表,传入的是空指针。如果这里不是空指针,即我们插入的不是链表的第一个节点,我们就完全不需要用到双指针。当然,如果用双指针的话,我们就不用特意的去考虑是不是空链表了。
|