1.首先,head指向的是哑节点(dummyNode),引用哑节点的目的是为了方便添加、删除节点方便。
2.head->next指向链表的首节点firstNode,在首节点前插入元素node, 此时,node便成为新的首节点,head->next = node, node->next = firstNode;即head->next->next = firstNode;
3.因此,每次新增加节点时,修改的是head->next的值(将原先的head->next = firstNode修改新增加的节点head->next = node)
head→next就是指向第一个元素,没有头结点的话在删除操作就需要额外多一些对第一个节点的判断操作,加头结点的目的就是让所有操作都统一
不知道你这个问题是否已经解决, 如果还没有解决的话:解答:【编者注: 链表无头结点】
int order(Node *head)
{Node *p=head;
while(p->next!=NULL)
if(p->datanext->data)
p=p->next;
else
break;
if(p->next==NULL)
return 1;
else
return 0;
}
答案: 带头结点的单链表其实就是在单链表的头部添加了一个特殊的节点,这个节点的作用是方便对链表的操作。head→next指的是头结点的下一个节点,也就是链表的第一个真实节点,而head→next→next则指的是链表的第二个节点,没有特殊意义。 举个例子,如果我们要删除链表中的某个节点,需要找到待删除节点的前一个节点,然后将前一个节点的next指向待删除节点的下一个节点。如果没有头结点,我们需要特判删除的是不是头节点,而且每次操作都需要从头开始查找待删除节点的前驱节点。而有了头结点后,我们可以简单地从head开始遍历链表,找到待删除节点的前驱节点,再进行删除操作。这样做的好处就是不需要特判头节点,也可以保证每次操作都从头结点开始,方便快捷。 因此,使用head→next而不是head→next→next是为了方便对链表的操作。