1.带哨兵的单链表的定义
/**
* 单向链表----带哨兵
*/
public class SinglyLinked {
/**
* 节点类
* 数据域和地址域
*/
private static class Node {
int value; //值
Node next; // 指向下一个节点
public Node() {
}
public Node(int value, Node next) {
this.value = value;
this.next = next;
}
}
/**
* 1.头指针
*/
private Node head = new Node(0, null);
}
2.向链表尾部添加元素,先找最后一个节点,然后插入
public Node findLast() {
Node p = head;
while (p.next != null) {
p = p.next;
}
return p;
}
public void addLast(int value) {
Node last = findLast();
last.next = new Node(value, null);
}
3.按照索引查找节点,条件是一直找到最后为空 p!=null
private Node findNode(int index) {
int i = -1;
for (Node p = head; p != null; p = p.next, i++) {
if (i == index) {
return p;
}
}
return null; // 没找到
}
头结点的序号是-1,所以i=-1开始
public void get(int index) {
Node node = findNode(index);
if (node == null) {
System.out.println("没找到");
return;
}
System.out.println(node.value);
}
4.索引位置index插入一个值
先找到index-1的节点,然后在后面插入,先让新节点连接。
public void insert(int index, int value) {
Node p = findNode(index - 1);
if (p == null) {
System.out.println("插入失败");
return;
}
// 插入节点
p.next = new Node(value, p.next);
}
5.向链表头部添加节点
直接调用index()方法,插入索引位置是0
public void addFirst(int value) {
insert(0, value);
}
6.按照索引位置删除
public void remove(int index) {
Node pre = findNode(index - 1);
if (pre == null) {
System.out.println("删除失败");
return;
}
// 指向删除节点
Node removed = pre.next;
if (removed == null) {
System.out.println("删除失败");
return;
}
pre.next = removed.next;
}
7.遍历
条件是p!=null,节点全部读取
public void loop() {
Node p = head.next;
while (p != null) {
System.out.println(p.value);
p = p.next;
}
}