链式表就是针对顺序表的缺点来设计的,补足的就是顺序表的缺点
(头插示意图)
示意图
此处包含c语言知识点 :
-
错误示例(如果只用一级指针):
如果函数签名是void SListPushBack(SListNode* phead, int x)
,而且调用SListPushBack(pList, 1)
。
函数内部的phead
只是外部pList
的一个副本,它最初也是NULL
。
即使你在函数里让phead = newNode;
,也只是修改了副本的值。外部的pList
依然还是NULL
。 -
正确做法(使用二级指针):
函数签名是void SListPushBack(SListNode** pphead, int x)
,调用时传递&pList
。
函数内部的pphead
是一个指针,它指向main函数中的pList
变量。
*pphead
就是解引用,它访问的就是main函数中的pList
。
所以*pphead = newNode;
这条语句,直接修改了main函数中pList
的值,让它从NULL
指向了新创建的第一个节点。 -
-
传一级指针 (
SListNode* phead
):传入的是一个节点的地址。函数可以读取或修改这个节点和后续所有节点的data
和next
,但不能修改头指针本身指向谁(即不能改变pList
的值)。 -
传二级指针 (
SListNode** pphead
):传入的是头指针变量的地址。函数获得了“修改头指针本身的权力”,它可以改变pList
的值,让它指向一个新的节点(尤其是在链表从无到有插入第一个节点时)。 -