dabocaiqq 2020-03-27 17:32 采纳率: 63.2%
浏览 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 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 关于#java#的问题:找一份能快速看完mooc视频的代码
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题