dabocaiqq 2020-03-27 17:32 采纳率: 58.8%
浏览 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 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd