java 数据结构单链表的操作

一、手写一个单链表

  

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