高分悬赏:Java语言怎么交换两个双向链表,首先请给出链表的设计类,然后再交换!

高分悬赏:Java语言怎么交换两个双向链表,首先请给出链表的设计类,然后再交换!

问题描述:

高分悬赏:Java语言怎么交换两个双向链表,首先请给出链表的设计类,然后再交换!

public class SLink {
public SNode head;

public SLink() {
    this.head = new SNode();
}
public boolean interChangeById(int id1,int id2) {
    SNode s = head;
    SNode node1 = null,node2 = null;
    int node1Count,node2Count;
    node1Count = node2Count = 0;

    if(id1 == id2) {
        return true;
    }

    /**
     * 向下遍历
     */
    while (s.next != null) {
        s = s.next;
        node1Count ++ ;
        if(s.student.stuId == id1) {
            /**
             * 记录节点1
             */
            node1 = s;
            break;
        }

    }

    s = head;
    while (s.next != null) {
        s = s.next;
        node2Count ++ ;
        if(s.student.stuId == id2) {
            /**
             * 记录节点2
             */
            node2 = s;
            break;
        }
    }


    if(node1 != null && node2 != null) {
        SNode temp = new SNode();
        /**
         * node1在后
         */
        if(node1Count > node2Count) {
            temp.next = node1.next;
            temp.prev = node1.prev;
            /**
             * 记录那个节点就先处理那个节点
             * 1、交换next
             * 2、交换prev
             * 3、设置之前节点的next(对接)
             */
            node1.next = node2.next;
            node1.prev = node2.prev;
            node2.prev.next = node1;

            if(node1.next.equals(node1)) {
                /**
                 * 说明两个节点相邻
                 */
                node1.next = node2;

                node2.next = temp.next;
                node2.prev = node1;
            }else {
                /**
                 * 说明节点不相邻
                 */
                node2.next = temp.next;
                node2.prev = temp.prev;
                temp.prev.next = node2;
            }
        }else {
            /**
             * node1在前
             */
            temp.next = node2.next;
            temp.prev = node2.prev;

            node2.next = node1.next;
            node2.prev = node1.prev;
            node1.prev.next = node2;
            if(node2.next.equals(node2)) {
                node2.next = node1;

                node1.next = temp.next;
                node1.prev = node2;
            }else {
                node1.next = temp.next;
                node1.prev = temp.prev;
                temp.prev.next = node1;
            }
        }
        return true;
    }
    return false;
}
public void displayStudent() {
    SNode s = head;
    while (s.next != null) {
        s = s.next;
        System.out.println(s.student);
    }
}

}