同时创建了两个单向链表,加入各自的数据,最后数据混乱了,没搞懂

今天练习单向链表的一些操作,在过程中遇到了 一些问题,一直没摸着头脑

同时创建了两个单向链表的实例,并加入相关的数据,前面输出都是正常输出数据的,在调试的过程中发现链表实例list的数据混乱了。也没有进行其他的操作,头大

控制台输出:


list:当前链表长度:6
Student(no=1, age=22, name=lucy)
Student(no=2, age=29, name=roan)
Student(no=3, age=18, name=king)
Student(no=4, age=22, name=smith)
Student(no=5, age=16, name=andy)
Student(no=6, age=16, name=jack)
singleLinkedList:当前链表长度:3
Student(no=2, age=29, name=roan)
Student(no=4, age=22, name=smith)
Student(no=7, age=16, name=json)
list:当前链表长度:6
Student(no=1, age=22, name=lucy)
Student(no=2, age=29, name=roan)
Student(no=4, age=22, name=smith)
Student(no=7, age=16, name=json)

代码:



public class SingleLinkedList01 {
    public static void main(String[] args) {
        Student lucy = new Student(1, 22, "lucy");
        Student roan = new Student(2, 29, "roan");
        Student king = new Student(3, 18, "king");
        Student smith = new Student(4, 22, "smith");
        Student andy = new Student(5, 16, "andy");
        Student jack = new Student(6, 16, "jack");
        Student json = new Student(7, 16, "json");
        Node<Student> node = new Node<>(lucy.getNo(),lucy);
        Node<Student> roanNode = new Node<>(roan.getNo(), roan);
        Node<Student> kingNode = new Node<>(king.getNo(), king);
        Node<Student> smithNode = new Node<>(smith.getNo(), smith);
        Node<Student> andyNode = new Node<>(andy.getNo(), andy);
        Node<Student> jackNode = new Node<>(jack.getNo(), jack);
        Node<Student> jsonNode = new Node<>(json.getNo(), json);
        SingleLinkedList<Student> list = new SingleLinkedList<>();
        list.addOrderByNo(node);
        list.addOrderByNo(roanNode);
        list.addOrderByNo(kingNode);
        list.addOrderByNo(smithNode);
        list.addOrderByNo(andyNode);
        list.addOrderByNo(jackNode);
        System.out.print("list:");
        list.show();

        SingleLinkedList<Student> singleLinkedList = new SingleLinkedList<>();
        singleLinkedList.addOrderByNo(roanNode);
        singleLinkedList.addOrderByNo(smithNode);
        singleLinkedList.addOrderByNo(jsonNode);
        System.out.print("singleLinkedList:");
        singleLinkedList.show();

        /*System.out.println("两个链表共同值:");
        List<Node<Student>> nodes = list.mergeSingleLinkedList(singleLinkedList);
        if (nodes != null && nodes.size() >0) {
            for (Node<Student> studentNode : nodes) {
                System.out.println(studentNode.getData());
            }
        }*/
        System.out.print("list:");
        list.show();
    }
}

/**
 *   单向链表
 */
class SingleLinkedList<T>{
    /**
     * 链表头结点 first
     */
    private Node<T> first = new Node<>(0, null);
    /**
     *   单向链表的长度
     */
    private int size = 0;

    public int getSize(){
        return size;
    }
    /**
     *   新增节点  无需新增
     * @param node  节点
     */
    public void add(Node<T> node) {
        Node<T> temp = first;
        while (temp.getNext() != null) {
            temp = temp.getNext();
        }
        size++;
        temp.setNext(node);
    }

    /**
     *   新增节点  有序新增,按照节点的no号从小到大排列
     * @param node  新增节点
     */
    public void addOrderByNo(Node<T> node) {
        Node<T> cur = first;
        while (true) {
            if (cur.getNext() == null) {
                size++;
                break;
            }
            //当前节点指向下一个节点的index大于正在插入的节点index,结束循环
            if (cur.getNext().getIndex() > node.getIndex()){
                size++;
                break;
            }
            //如果插入的index存在,结束循环,值替换
            if (cur.getNext().getIndex() == node.getIndex()) {
                break;
            }
            cur = cur.getNext();
        }
        node.setNext(cur.getNext());
        cur.setNext(node);
    }

    /**
     *   获取头节点
     * @return  firstNode
     */
    public Node<T> getFirst(){
        Node<T> res = null;
        if (first.getNext() == null) {
            System.err.println("链表为null");
        }else{
            res = first.getNext();
            first.setNext(res.getNext());
        }
        size--;
        return res;
    }

    public Node<T> getLast() {
        Node<T> res = null;
        if (first.getNext() == null) {
            System.err.println("链表为null");
        }else{
            Node<T> cur = first.getNext();
            while (cur.getNext().getNext() != null) {
                cur = cur.getNext();
            }
            size--;
            res = cur.getNext();
            cur.setNext(null);
        }
        return res;
    }
    public void inversion() {
        if (first.getNext() == null) {
            System.err.println("链表为null");
        }else{
            Node<T> cur = first.getNext();
            Node<T> inversion = new Node<>(-1, null);
            Node<T> next;
            while (cur != null) {
                next = cur.getNext();
                cur.setNext(inversion.getNext());
                inversion.setNext(cur);
                cur = next;
            }
            first.setNext(inversion.getNext());
        }
    }

    /**
     *   链表反转,利用栈Stack的特性:先进后出
     */
    public void inversionByStack() {
        Stack<Node<T>> inversion = new Stack<>();
        if (first.getNext() == null) {
            System.err.println("链表为null");
        }else{
            Node<T> cur =first.getNext();
            while (cur != null) {
                inversion.add(cur);
                cur = cur.getNext();
            }
            while (!inversion.isEmpty()) {
                System.out.println(inversion.pop().getData());
            }
        }
    }

    /**
     * 合并链表,得到共同部分
     *
     * @param singleLinkedList
     */
    public List<Node<T>> mergeSingleLinkedList(SingleLinkedList<T> singleLinkedList) {
        List<Node<T>> result = new ArrayList<>();
        //两链表不能为null
        if (singleLinkedList.first.getNext() == null || this.first.getNext() == null) {
            return result;
        }
        Node<T> thisCur = this.first.getNext();
        Node<T> nodeCur = singleLinkedList.first.getNext();
        while (thisCur != null || nodeCur != null) {
            if (thisCur.getIndex() > nodeCur.getIndex()) {
                nodeCur=nodeCur.getNext();
            }
            if (thisCur.getIndex() < nodeCur.getIndex()) {
                thisCur = thisCur.getNext();
            }
            if (thisCur.getIndex() == nodeCur.getIndex()) {
                result.add(thisCur);
                thisCur = thisCur.getNext();
                nodeCur = nodeCur.getNext();
            }
        }
        return result;
    }
    /**
     *   展示链表所有数据
     */
    public void show() {
        if (first.getNext() == null) {
            System.err.println("链表为null");
        }else{
            System.out.println("当前链表长度:" + size);
            Node<T> temp = first.getNext();
            while (temp != null) {
                System.out.println(temp.getData());
                temp = temp.getNext();
            }
        }
    }
}

@Data
@NoArgsConstructor
class Node<T> {
    private int index;
    private T data;
    private Node<T> next;

    public Node(int index, T data) {
        this.index = index;
        this.data = data;
    }
}
@Data
@ToString
class Student{
    private int no;
    private int age;
    private String name;

    public Student(int no, int age, String name) {
        this.no = no;
        this.age = age;
        this.name = name;
    }
}

刚不经意间发现,创建的节点实例再次使用会加上子节点,导致数据混乱。如果需要加入相同的节点,需要创建值相同的不同节点实例对象