文章目录

  • 头插法
  • 1 思路
  • 2 插入过程
  • 2.1 定义node节点
  • 2.2 将node插入到原来head前面的位置
  • 2.3 将node节点与下一个结点链接起来
  • 2.4 更改head的指向
  • 3 注意点
  • 4 为空的情况
  • 5 代码实现



数据结构java单链表 java单链表头插法_数据结构java单链表

头插法

数据结构java单链表 java单链表头插法_数据结构_02

1 思路

  • 先定义一个新的节点,命名为node。
  • 将node插入到原来单链表头节点的前面。
  • 使node指向下一个结点,也就是原表的head。
  • 再将node改成头节点,head指向node。

原来的单链表:


数据结构java单链表 java单链表头插法_java_03

插入后的单链表:


数据结构java单链表 java单链表头插法_java_04

2 插入过程

数据结构java单链表 java单链表头插法_数据结构java单链表_05

2.1 定义node节点

数据结构java单链表 java单链表头插法_intellij-idea_06

2.2 将node插入到原来head前面的位置

数据结构java单链表 java单链表头插法_数据结构java单链表_07

2.3 将node节点与下一个结点链接起来

数据结构java单链表 java单链表头插法_intellij-idea_08


将node节点的地址域存上下一个节点的地址

具体的做法是:node.next = head,将node的地址域指向原来的头节点。

2.4 更改head的指向

数据结构java单链表 java单链表头插法_intellij-idea_09


让head重新指向单链表的node。

具体做法是:head = node

3 注意点

在头插的时候,要先与后面的结点绑定,再更改head的指向。就是先让要插入的结点与下一个结点链接之后再让head指向新的头结点位置。

先更改head指向再绑定后面结点的情况:

  1. 执行head = node前:
  2. 数据结构java单链表 java单链表头插法_数据结构_10

  3. 执行head = node后:
  4. 数据结构java单链表 java单链表头插法_数据结构_11

  5. 当执行过后,head此时与node指向了同一个节点,而在执行node.next = head的时候相当于让它自己指向自己。
  6. 数据结构java单链表 java单链表头插法_数据结构_12

  7. 当前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;
}

数据结构java单链表 java单链表头插法_数据结构java单链表_13