参考自:https://www.cnblogs.com/whgk/p/6589920.html
链表、头指针、头结点(经典) 参考自:https://blog.csdn.net/foreverhuylee/article/details/38780051
有时在单链表的第一个结点之前附设一个结点,称之为头结点 。 头结点的数据域可以不存储任何信息,也可以存储如线性表长度等类的附加信息,头结点的指针域存储指向第一个结点的指针(即第一个元素结点的存储位置)。如图2(a)所示,此时,单链表的头指针指向头结点。若线性表为空,则头结点的指针域为“空”,如图所示。
头指针、头结点、第一个结点的区别与联系?
(1)头指针明显是一个指针,指向头结点
头节点的next指针指向第一个节点
第一个节点是一个节点,data变量存放第一个数据,next指针变量指向第二个节点
(2)头指针是指向头结点的指针
头结点是出于第一个结点之前的空结点
第一个结点就是出于第一个的结点(除头结点外)
(3)一个链表中,可以没有头结点,但是一定有头指针,头指针是对单链表的标识,
如果没有头结点,则头指针指向第一个结点
1单链表的定义
1.1 编写一个Node类来充当结点的模型。我们知道,其中有两个属性,1存放数据的data,2存放下一结点的引用,
//Definition for singly-linked list.
public class ListNode {
int val;//存放数据的变量
ListNode next;//存放节点的变量(类似指针),默认为null
ListNode(int x) { val = x; }//构造方法,在构造时能够给data赋值
}
1.2 计算链表的长度
/**
*计算链表的长度,也就是有多少个节点
*return 节点个数
**/
public int length(){
int length = 0;
Node length = head;
while (temp.next!=null){
length++;
temp=temp.next;
}
return length;
}
1.3 增加结点操作,addNode(Node)
/**
* 增加操作
* 直接在链表的最后插入新增的结点即可
* 将原本最后一个结点的next指向新结点
*/
public void addNode(Node node){
//链表中有结点,遍历到最后一个结点
Node temp = head; //一个移动的指针(把头结点看做一个指向结点的指针)
while(temp.next != null){ //遍历单链表,直到遍历到最后一个则跳出循环。
temp = temp.next; //往后移一个结点,指向下一个结点。
}
temp.next = node; //temp为最后一个结点或者是头结点,将其next指向新结点
}
1.4 遍历链表,打印所有data
/* 遍历链表,打印所有data*/
public void print(){
Node temp= head.next;
while (temp!=null){
System.out.print(temp.data+",");
temp=temp.next;
}
System.out.println();
}