单向链表是很多高级数据结构和算法的基础,比如队列、栈、图、哈希...
以下demo基本包含了单向链表的增删改查:
节点类 SignLinkedNode.java
/**
* 单向链表节点
*/
public class SignLinkedNode implements Serializable {
public Integer value;
//下一个节点
public SignLinkedNode next;
public SignLinkedNode() {
}
public SignLinkedNode(Integer value) {
this.value = value;
}
@Override
public String toString() {
return String.valueOf(value);
}
}
单向链表数据结构和算法类 SignLinked.java
/**
* 单向链表
*/
public class SignLinked {
//头结点
public SignLinkedNode head;
//链表长度
public int size;
/**
* 判空
*
* @return
*/
public Boolean isEmpty() {
return size == 0;
}
/**
* 遍历节点-从头到尾
*/
public void show() {
if (isEmpty()) {
System.out.println("数据为空!");
return;
}
SignLinkedNode temp = head;
while (temp != null) {
System.out.printf(temp + ", ");
temp = temp.next;
}
System.out.println();
}
/**
* 添加节点
*
* @param node 节点
*/
public void add(SignLinkedNode node) {
//第一个元素,初始化头结点
if (size == 0) {
head = node;
} else {
//第一个之后的元素
SignLinkedNode temp = head;
while (temp.next != null) {
temp = temp.next;
}
temp.next = node;
}
size++;
}
/**
* 添加节点
*
* @param value 节点值
*/
public void add(int value) {
add(new SignLinkedNode(value));
}
//value查找元素
public SignLinkedNode getByValue(Integer value) {
SignLinkedNode temp = head;
while (temp != null) {
if (value.equals(temp.value)) {
System.out.println("找到了: " + temp);
return temp;
}
temp = temp.next;
}
return null;
}
/**
* 删除节点
*
* @param value 节点值
* @return
*/
public Boolean removeByValue(Integer value) {
if (getByValue(value) == null) {
System.out.println("未找到value为: " + value + "的数据!");
return false;
}
//临时节点
SignLinkedNode tempHead = new SignLinkedNode();
tempHead.next = head;
SignLinkedNode temp = tempHead;
while (temp.next != null) {
if (value.equals(temp.next.value)) {
//删除
temp.next = temp.next.next;
size--;
return true;
}
temp = temp.next;
}
//头结点指向
head = tempHead.next;
return false;
}
/**
* 删除元素
*
* @param index 节点位置
* @return
*/
public Boolean removeByIndex(int index) {
int i = 0;
//临时节点
SignLinkedNode tempHead = new SignLinkedNode();
tempHead.next = head;
SignLinkedNode temp = tempHead;
while (temp.next != null) {
if (i == index) {
temp.next = temp.next.next;
size--;
return true;
}
i++;
temp = temp.next;
}
//头结点指向
head = tempHead.next;
return false;
}
/**
* 修改节点
*
* @param node 节点
* @return
*/
public Boolean update(SignLinkedNode node) {
if (node == null || node.value == null) {
System.out.println("修改数据为空!");
return false;
}
SignLinkedNode findNode = getByValue(node.value);
if (findNode == null) {
System.out.println("修改数据不存在!");
return false;
}
findNode.value = node.value;
return true;
}
/**
* 获取第index位置的值
*
* @param index 位置
* @return
*/
public SignLinkedNode getIndex(int index) {
int i = 0;
SignLinkedNode temp = head;
while (temp != null) {
if (i == index) {
return temp;
}
i++;
temp = temp.next;
}
return null;
}
/**
* 获取链表长度
*
* @return
*/
public int size() {
return size;
}
/**
* 获取倒数第x个元素
* 原理-先让前一个指针先走x步
*
* @param x
* @return
*/
public SignLinkedNode getBack(int x) {
int i = 0;
SignLinkedNode temp = head;
SignLinkedNode s = head;
while (temp != null) {
if (i >= x) {
s = s.next;
}
i++;
temp = temp.next;
}
return s;
}
/**
* 获取中间节点
* 原理-快慢指针,快一倍
* @return
*/
public SignLinkedNode getMid() {
SignLinkedNode temp = head;
SignLinkedNode s = head;
while (temp != null && temp.next != null) {
//慢指针
s = s.next;
//快指针
temp = temp.next.next;
}
return s;
}
public static void main(String[] args) {
SignLinked signLinked = new SignLinked();
//初始化链表
System.out.println("数组...");
int[] arr = {7, 3, 8, 10, 12, 5, 1, 9, 2, 6, 4};
System.out.println(Arrays.toString(arr));
for (int value : arr) {
signLinked.add(new SignLinkedNode(value));
}
System.out.println("遍历节点...");
signLinked.show();
// signLinked.show();
// signLinked.removeByValue(2);
System.out.println("删除节点2...");
signLinked.removeByIndex(2);
System.out.println("遍历节点...");
signLinked.show();
// System.out.println(signLinked.getIndex(3));
// System.out.println(signLinked.size());
System.out.println(signLinked.getBack(1));
System.out.println(signLinked.getBack(2));
System.out.println(signLinked.getBack(9));
System.out.println(signLinked.getBack(10));
System.out.println(signLinked.getBack(11));
System.out.println(signLinked.getMid());
// System.out.println(signLinked.size());
}
}