一、手写一个单链表
public class ListNode<T>{ /** * 数据 */ public T obj; /** * tail 指针 */ public ListNode next; ListNode(T obj){ this.obj = obj; } }
创建单链表工具类
public class ListNodeUtils { /** * 单链表头部插入新节点 * @param head 链表头节点 * @param newHead 要插入的头节点 */ public static void insertHead(ListNode head, ListNode newHead){ ListNode oldHead = head; //保存原头节点 head = newHead; //新的头节点赋值给原头节点 head.next = oldHead; //新的头节点指向原头节点 } /** * 单链表尾部插入新节点 * @param tail 链表尾节点 * @param newTail 要插入的尾节点 */ public static void insertTail(ListNode tail, ListNode newTail){ ListNode oldTail = tail; //保存原来的尾节点 tail = newTail;//赋值新的尾节点给原来的尾节点 oldTail.next = tail;//旧的尾节点指向新的尾节点 tail.next = null;//新的尾节点指向NULL } /** * 单链表在node1之后插入node2 * @param node1 * @param node2 */ public static void insetNode(ListNode node1, ListNode node2){ ListNode next = node1.next;//保存原节点的下个节点 node1.next = node2;//node1节点指向node2节点 node2.next = next;//node2节点指向node1的下个节点 } /** * 删除节点 * @param head * @param delNode */ public static void delNode(ListNode head, ListNode delNode){ //删除非 尾节点 if(delNode != null && delNode.next != null){ ListNode next = delNode.next;//保存下个节点 delNode.obj = next.obj;//将下个节点的值赋值给当前节点 delNode.next = next.next;//将该节点指向下个节点的下个节点 next = null;//释放需要删除的节点 } //删除尾节点 if(delNode.next == null){ while (head != null){ if(head.next != null && head.next == delNode){ head.next = null; delNode = null; } head = head.next; } } } /** * 查找节点 * @param head 头节点 * @param obj 需要查找节点 */ public static <T> int findNode(ListNode head, T obj){ int index = 0; while (head != null){ if(head.obj.equals(obj)){ return index; } index ++; head = head.next; } return index; } /** * 遍历单链表 * @param head 头节点 */ public static void cycleNode(ListNode head){ while(head != null){ System.out.print(head.obj + "; "); head = head.next; } System.out.println(); } }
测试单链表工具类的方法
public static void main(String[] args) { //创建三个节点 ListNode listNode1 = new ListNode("这是节点1"); ListNode listNode2 = new ListNode("这是节点2"); ListNode listNode3 = new ListNode("这是节点3"); //创建节点指向关系 listNode1.next = listNode2; listNode2.next = listNode3; listNode3.next = null; cycleNode(listNode1); //头部插入测试 ListNode listNode0 = new ListNode("这是节点0"); insertHead(listNode1, listNode0); cycleNode(listNode0); //尾部插入测试 ListNode listNode4 = new ListNode("这是节点4"); insertTail(listNode3, listNode4); cycleNode(listNode0); //中间插入 node2后插入 node5 ListNode listNode5 = new ListNode("这是节点5"); insetNode(listNode2, listNode5); cycleNode(listNode0); //删除节点 delNode(listNode0, listNode5); cycleNode(listNode0); //查找节点 System.out.println(findNode(listNode0, "这是节点3")); }
运行结果:
这是节点1; 这是节点2; 这是节点3; 这是节点0; 这是节点1; 这是节点2; 这是节点3; 这是节点0; 这是节点1; 这是节点2; 这是节点3; 这是节点4; 这是节点0; 这是节点1; 这是节点2; 这是节点5; 这是节点3; 这是节点4; 这是节点0; 这是节点1; 这是节点2; 这是节点3; 这是节点4; 3