dabocaiqq 2020-03-27 17:32 采纳率: 63.3%
浏览 117
已采纳

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

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

  • 写回答

1条回答 默认 最新

  • 大拙男 2020-04-16 10:20
    关注

    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);
        }
    }
    

    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 爬虫保存的scv文件0kb
  • ¥20 如何实现基于强化学习的带电作业机械臂的运动规划与控制
  • ¥15 使用wpf制作打砖块游戏时遇到的一个Bug
  • ¥15 qrCodeDetector.detectAndDecode
  • ¥15 海洋可控源和大地电磁一维联合反演
  • ¥15 MFC多文档程序获取视图指针问题
  • ¥20 解体如何编写程序还有运行结果截图
  • ¥15 如何把matlabR2023遗传算法工具箱里面的各类选项对应的代码调出来呢?
  • ¥30 MDIGetActive() 获取活动view
  • ¥15 有数据,如何安装使用CLIP模型检索图片