链表
是以节点的方式来存储 每个节点包含data域,next域:指向下一个节点 链表的各个节点不一定是连续的 链表分带头节点的链表和不带头节点的链表
head节点
不存放具体的数据 用来表示单链表的头
添加(创建)
创建一个head头节点,表示这个单链表的开始 每添加一个节点,就加入到该链表的最后
遍历
通过一个辅助变量,帮助遍历
public class LinkedList {
public static void main(String[] args) {
Node node = new Node(1);
Node node1 = new Node(2);
Node node2 = new Node(3);
Node node3 = new Node(4);
SingleLinkedList SLL = new SingleLinkedList();
//这个测试不考虑编号
SLL.addNode(node);
SLL.addNode(node1);
SLL.addNode(node2);
SLL.addNode(node3);
SLL.list();
SingleLinkedList SLL2 = new SinleLinkedList();
//测试考虑编号
SLL2.addByOrder(node);
SLL2.addByOrder(node2);
SLL2.addByOrder(node1);
SLL2.addByOrder(node3);
SLL2.addByOrder(node1);
SLL2.list();
}
}
class SingleLinkedList{
//初始化头节点
private Node node = new Node(0);
/**
* 添加节点到单链表
*
* 不考虑编号
* 1. 找到当前链表的最后的节点
* 2. 将最后者节点的next指向新的节点
* @param newNode
*/
public void addNode(Node newNode){
Node temp = node;
//遍历
while(true){
//在链表的最后一个元素是的nextNode是空,所以可以判断是不是最后一个元素
//循环结束后,temp就指向了最后的元素的位置
if (temp.nextNode == null){
break;
}
temp = temp.nextNode;
}
//把新的节点给到链表的最后一个元素
temp.nextNode = newNode;
}
//考虑编号的问题
public void addByOrder(Node newNode){
Node temp = node;
boolean flag = false;
while(true){
if (temp.nextNode == null){
break;
}
if (temp.nextNode.data > newNode.data){
break;
}else if (temp.nextNode.data == newNode.data){
flag = true;
break;
}
temp = temp.nextNode;
}
if (flag){
System.out.println("编号存在,不能添加");
}else {
newNode.nextNode = temp.nextNode;
temp.nextNode = newNode;
}
}
/**
* 遍历单链表
*/
public void list(){
if (node.nextNode == null){
System.out.println("链表为空");
return;
}
Node temp = node.nextNode;
while (true){
//判断是不是链表的最后
if (temp == null){
break;
}
System.out.println(temp);
//指向下一个节点,防止死循环
temp = temp.nextNode;
}
}
}
class Node{
public int data;
//nextNode用来指向下一个节点
public Node nextNode;
public Node(int data){
this.data = data;
}
@Override
public String toString() {
return "Node{" +
"data=" + data +
'}';
}
}