(1)链表是以节点的方式来存储
(2)每个节点包含data域和next域:指向下一个节点
(3)链表的各个节点不一定是连续存储
(4)链表分带头节点的和没有头节点的链表,根据实际需求来定
/*** 单向链表节点*/public class Node {/*** 节点id*/private Integer id;/*** 节点数据*/private String data;/*** 指向下一个节点*/private Node next;public Node(Integer id, String data) {this.id = id;this.data = data;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getData() {return data;}public void setData(String data) {this.data = data;}public Node getNext() {return next;}public void setNext(Node next) {this.next = next;}@Overridepublic String toString() {return "Node{" + "id=" + id + ", data='" + data + '\'' + '}';}}
/*** 单向链表*/public class LinkedList {/*** 初始化一个头节点*/private Node head = new Node(null, null);/*** 新增节点*/public void add(Node node) {Node temp = head;// 遍历链表,找到最后一个节点while(true) {if (temp.getNext() == null) {break;}temp = temp.getNext();}// 当退出while循环时,temp指向了最后一个节点temp.setNext(node);}/*** 修改节点* @param node*/public void update(Node node) {if (head.getNext() == null) {System.out.println("链表为空,修改失败!");}Node temp = head.getNext();// 遍历链表while(temp != null) {if (Objects.equals(temp.getId(), node.getId())) {temp.setData(node.getData());}temp = temp.getNext();}}/*** 删除节点*/public void del(Integer id) {if (head.getNext() == null) {System.out.println("链表为空,删除失败!");}Node temp = head;// 遍历链表while(temp != null) {// 表示到链表最后,直接退出if (temp.getNext() == null) {break;}// 找到待删除节点的前一个节点if (Objects.equals(temp.getNext().getId(), id)) {temp.setNext(temp.getNext().getNext());}temp = temp.getNext();}}/*** 获取节点*/public Node get(Integer id) {if (head.getNext() == null) {System.out.println("链表为空");return null;}Node temp = head.getNext();while(temp != null) {if (Objects.equals(temp.getId(), id)) {return temp;}temp = temp.getNext();}return null;}/*** 查看所有节点*/public void list() {if (head.getNext() == null) {System.out.println("链表为空");return;}Node temp = head.getNext();while(temp != null) {System.out.println(temp);temp = temp.getNext();}}/*** 链表节点反转* @return*/public void reverse() {if (head.getNext() == null) {return;}LinkedList tempList = new LinkedList();// 遍历原链表,依次放在临时链表的最前面Node temp = head.getNext();while(temp != null) {// 1、首先找到原链表当前节点的下一个节点Node nextNode = temp.getNext();// 2、把新链表的第一个节点插入到当前节点的后面temp.setNext(tempList.head.getNext());// 3、把当前节点插入新链表的第一个节点中tempList.head.setNext(temp);// 4、继续寻找下一个节点temp = nextNode;}head.setNext(tempList.head.getNext());}/*** 反向打印*/public void reversePrint() {reversePrint2(head.getNext());}/*** 反向输出(递归)*/private void reversePrint2(Node node) {if (node != null) {reversePrint2(node.getNext());System.out.println(node);}}public static void main(String[] args) {LinkedList linked = new LinkedList();Scanner scanner = new Scanner(System.in);boolean loop = true;while (loop) {System.out.print("【单向链表】新增(1)、查找(2)、修改(3)、删除(4)、反转(5)、反向打印(6)、打印(7)、退出(0):");Integer key = scanner.nextInt();switch (key) {case 1:System.out.print("新增Id:");int id = scanner.nextInt();System.out.print("新增Data:");String data = scanner.next();Node node = new Node(id, data);linked.add(node);break;case 2:System.out.print("查找Id:");int id2 = scanner.nextInt();System.out.println(linked.get(id2));break;case 3:System.out.print("修改Id:");int updateId = scanner.nextInt();System.out.print("修改Data:");String updateData = scanner.next();Node updateNode = new Node(updateId, updateData);linked.update(updateNode);break;case 4:System.out.print("删除Id:");int deleteId = scanner.nextInt();linked.del(deleteId);break;case 5:linked.reverse();System.out.println("反转完成!");break;case 6:linked.reversePrint();break;case 7:linked.list();break;case 0:scanner.close();loop = false;break;default: break;}}System.out.println("程序退出。。。");}}
