链表新手在刚刚学习链表操作的时候,总会对繁杂的链表操作感到陌生而恐惧。因为其思维模式较线性表来说确实有本质上的不同。举个例子:线性表相邻元素之间紧邻,没有空位。故进行插入,删除操作时往往都需要“大动干戈”,但是其操作在理解上的难度较小,不像链表对初学者的恐吓度这样的高。我在初次学习链表时也对这些代码感到恼火,于是我总结出了一套自己对链表的"世界观"辅助我进行记忆,理解。
链表定义联想到"一个满是房屋和路牌的街区"
typedef struct LinkList
{
ElemType data;
struct LinkList *next;
};
在C语言中,指针变量是存放地址的变量。所以我自然而然的联想到将其中的next指针理解为"指向下一幢房子地址的路牌"。
- 1号房即为ElemType data,其中存放了元素data
- 紧接着1号房的路牌(路牌上写着2号房)即为LinkList *next,指向了下一幢房子
- 1号房的房子本身以及其指向2号房的路牌为一个整体
- 因为3号房之后没有路牌,故证明此街区中仅有这么3幢房子(链表中仅有三个结点),即类比到house3->next = nullptr为整个链表的结束条件
- 不要因为此图三幢房子处于同一水平线上而误认为链表其存储空间也是连续的。如下图所示
发现了8!诚然C/C++中指针的灵活使用是具有一定难度的,且链表中的操作均和指针挂上了钩,但不要把链表本身想的太复杂,之后的博客中我所写的链表操作,均可以借助这样的房屋的建造/路牌的改向等等…来进行辅助理解。你要做的是和我一起塑造起链表的"世界观",克服你"链表萌新"的恐惧。