文章目录
头插法
1 思路
- 先定义一个新的节点,命名为node。
- 将node插入到原来单链表头节点的前面。
- 使node指向下一个结点,也就是原表的head。
- 再将node改成头节点,head指向node。
原来的单链表:
插入后的单链表:
2 插入过程
2.1 定义node节点
2.2 将node插入到原来head前面的位置
2.3 将node节点与下一个结点链接起来
将node节点的地址域存上下一个节点的地址。
具体的做法是:node.next = head,将node的地址域指向原来的头节点。
2.4 更改head的指向
让head重新指向单链表的node。
具体做法是:head = node
3 注意点
在头插的时候,要先与后面的结点绑定,再更改head的指向。就是先让要插入的结点与下一个结点链接之后再让head指向新的头结点位置。
先更改head指向再绑定后面结点的情况:
-
执行head = node前:
-
执行head = node后:
-
当执行过后,head此时与node指向了同一个节点,而在执行node.next = head的时候相当于让它自己指向自己。
当前node结点的地址是0x10,因为node和head指向同一个位置,head的地址也是0x10,所以node的地址域存的是0x10,会因为无法连接到下一个结点而带来错误。
4 为空的情况
如果要在一个空的单链表中的插入一个node结点,步骤和上面不为空的情况相同,先绑定后面,再更改head的指向。
只不过在实现头插法的时候,不需要考虑单链表是不是空的,因为它总是在头部插入。
5 代码实现
//头插法 - 插入结点到头部
//头插法可以不考虑表是不是null - 即使表是空的node的地址域也是null,也能找到下一个结点
public void addStart(int data) {
//1.定义一个要插入的结点node
ListNode node = new ListNode(data);
//2.让node的地址域指向原表的头结点
node.next = this.head;
//3.再让原表的头结点直向新表的头结点(node)
head = node;
}