单向链表
链表不像数组那样,可以通过索引来获取,单向链表查找的时候必须从头开始往后一个个找,而不能从中间找,也不能从后往前找。看看下图所示的单向链表。
节点类代码
class MyNode {
int data;
MyNode next;
String name;
public MyNode() {
}
public MyNode(int data) {
this.data = data;
}
public MyNode(int data, String name) {
this.data = data;
this.name = name;
}
@Override
public String toString() {
return "MyNode{" +
"data=" + data +
", name='" + name + '\'' +
'}';
}
}
单向链表代码
public class MySingleLinkedList {
// 头节点不放任何数据
private MyNode head = new MyNode();
// 添加到单向链表的末尾
public void add(MyNode newNode) {
MyNode temp = head;
// 遍历整个单向链表,找到单向链表末尾
while (true) {
// 找到了单向链表的末尾
if (temp.next == null) {
break;
} else { // 否则继续遍历
temp = temp.next;
}
}
// 循环结束,即找到了单向链表末尾,最后一个节点指向新节点
temp.next = newNode;
}
// 按排序添加到单向链表
public void addByOrder(MyNode newNode) {
MyNode temp = head;
// 遍历单向链表,找到插入位置(插入位置前一个元素)
while (true) {
// 找到了插入位置
if (temp.next == null || temp.next.data > newNode.data) {
break;
} else { // 否则继续遍历
temp = temp.next;
}
}
// 循环结束,插入
newNode.next = temp.next;
temp.next = newNode;
}
// 修改单项链表
public void update(MyNode myNode) {
MyNode temp = head;
// 判断单向链表是否为空
if (temp.next == null) {
System.out.println("单项链表为空");
return;
}
// 找需要修改的节点
while (true) {
if (temp.next == null) {
System.out.println("单项链表没有节点 " + myNode);
break;
}
if (temp.next.data == myNode.data) {
temp.next.name = myNode.name;
break;
}
temp = temp.next;
}
}
// 删除节点
public void remove(int id) {
MyNode temp = head;
// 判断单向链表是否为空
if (temp.next == null) {
System.out.println("单项链表为空");
return;
}
// 找到data为id的节点
while (true) {
if (temp.next == null) {
System.out.println("没有该节点");
break;
}
// 删除节点
if (temp.next.data == id) {
temp.next = temp.next.next;
break;
}
temp = temp.next;
}
}
// 打印单向链表
public void print() {
// 判断单向链表是否为空
if (head.next == null) {
System.out.println("单项链表为空");
return;
}
MyNode temp = head.next;
while (true) {
// 遍历结束则退出
if (temp == null) {
break;
}
// 输出节点信息
System.out.println(temp);
temp = temp.next;
}
}
}
测试一下
public static void main(String[] args) {
MySingleLinkedList mySingleLinkedList = new MySingleLinkedList();
System.out.println("----------------------添加----------------------");
mySingleLinkedList.add(new MyNode(1, "Tom"));
mySingleLinkedList.add(new MyNode(3, "Jone"));
mySingleLinkedList.addByOrder(new MyNode(2, "kiss"));
mySingleLinkedList.addByOrder(new MyNode(4, "Keb"));
mySingleLinkedList.print();
System.out.println("----------------------修改----------------------");
mySingleLinkedList.update(new MyNode(3, "Hul"));
mySingleLinkedList.print();
mySingleLinkedList.update(new MyNode(5, "Yke"));
System.out.println("----------------------删除----------------------");
mySingleLinkedList.remove(4);
mySingleLinkedList.print();
}
运行结果
----------------------添加----------------------
MyNode{data=1, name='Tom'}
MyNode{data=2, name='kiss'}
MyNode{data=3, name='Jone'}
MyNode{data=4, name='Keb'}
----------------------修改----------------------
MyNode{data=1, name='Tom'}
MyNode{data=2, name='kiss'}
MyNode{data=3, name='Hul'}
MyNode{data=4, name='Keb'}
单项链表没有节点 MyNode{data=5, name='Yke'}
----------------------删除----------------------
MyNode{data=1, name='Tom'}
MyNode{data=2, name='kiss'}
MyNode{data=3, name='Hul'}