关于#java#的问题:都找不着为啥我写的代码一直运行不出来

Java链表中的节点每k个一组翻转

看了一天了,都找不着为啥我写的代码一直运行不出来,但也不报错;注释详细,有回必赞


public class BM3 {
    public static void main(String[] args) {
        //构建单链表的头指针
        ListNode head = new ListNode(1);
        ListNode HeadNext = head;
        for(int i=2;i<6;i++){
            //循环构建下一个节点
            HeadNext.next = new ListNode(i);
            HeadNext = HeadNext.next;
        }
        //测试
        BM3reverse a3 = new BM3reverse();
        ListNode b3 = a3.BM3reverse(head,3);
        while(b3 != null){
            System.out.print(b3.val);
            b3 = b3.next;
        }
    }
}
//节点构造器
class ListNode {
    int val;
    ListNode next = null;
    public ListNode(int val) {
        this.val = val;
    }
}
class BM3reverse {
    public ListNode BM3reverse (ListNode head, int k) {
        // 如果没有换则不作改动
        if(k == 1 || head.next == null){
            return head;
        }else{
            //子链的两端之左
            ListNode LeftNode = new ListNode(0);
            //子链的两端之右
            ListNode RightNode = head;
            //记录新节点的上一个节点
            ListNode SubchainOldNode = head;
            //返回的头节点
            ListNode head0 = LeftNode;
            for(int i=2;i<=k;i++){
                //指针移向下一位
                head = head.next;
                //在此复制产生一个新节点
                ListNode SubchainNewNode = head;
                //让新节点指向上一个节点,完成反转
                SubchainNewNode.next = SubchainOldNode;
                //然后让新节点变成老节点
                SubchainOldNode = SubchainNewNode;
                //当一组数反转完成
                if (i == k){
                    //衔接,反转后的子链头节点为最新节点,左端指向子链的最新节点
                    LeftNode.next = SubchainNewNode;
                    //反转后的子链尾节点为最老节点,右端端指向指针的下一位
                    RightNode.next = head.next;
                    //重制,进行新一轮反转
                    i = 2;
                    //更新下一子链的两端之左
                    LeftNode = RightNode;
                    //更新下一子链的两端之右
                    RightNode = head.next;
                    //更新新节点的上一个节点
                    SubchainOldNode = head.next;
                    //更新指针
                    head = head.next;
                }
                if (head.next == null){
                    //当一组数没反转完成或者到链尾,就跳出循环
                    break;
                }
            }
            return head0.next;
        }
    }
}

【以下回答由 GPT 生成】

问题代码存在两个问题:

  1. 在递归调用 BM3reverse 方法时,传入的参数 k 没有正确更新。在每次翻转完 k 个节点后,需要将 k 减去已经翻转的节点数,即 k - 1,而不是保持原值 k

  2. 在翻转节点的过程中,没有正确设置子链的两端之左(LeftNode)的 next 指针。需要将 LeftNode.next 指向翻转后的子链的首节点,即 prev

以下是修正后的代码:

public class BM3 {
    public static void main(String[] args) {
        ListNode head = new ListNode(1);
        ListNode headNext = head;
        for(int i=2; i<6; i++){
            headNext.next = new ListNode(i);
            headNext = headNext.next;
        }

        BM3reverse a3 = new BM3reverse();
        ListNode b3 = a3.BM3reverse(head, 3);
        while (b3 != null) {
            System.out.print(b3.val + " ");
            b3 = b3.next;
        }
    }
}

class ListNode {
    int val;
    ListNode next = null;
    public ListNode(int val) {
        this.val = val;
    }
}

class BM3reverse {
    public ListNode BM3reverse(ListNode head, int k) {
        if(k == 1 || head.next == null) {
            return head;
        } else {
            ListNode leftNode = new ListNode(0);
            ListNode rightNode = head;
            ListNode prev = null;

            // 记录已翻转的节点数
            int count = 0;
            while(count < k && rightNode != null) {
                ListNode tmp = rightNode.next;
                rightNode.next = prev;
                prev = rightNode;
                rightNode = tmp;
                count++;
            }

            // 连接子链的两端之左和之右
            leftNode.next = prev;
            head.next = BM3reverse(rightNode, k - 1);

            return leftNode.next;
        }
    }
}

运行上述修正后的代码,输出结果为 3 2 1 4 5,表示链表中的节点每 3 个一组翻转后的结果是 [3, 2, 1, 4, 5]



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^