使用链接节点进行选择排序,输出不正确[Java]

时间:2018-02-03 20:15:26

标签: java

我使用selectionSort进行排序,并且在selectionSort中有一个交换函数,但是,swap中的head的值在外部是不一样的(在selectionSort的调用函数之后),谢谢你的回复。 / p>

        public Node selectionSort(Node head){
        if(head == null)
            return head;
        Node min = head;
        Node beforeMin = null;
        Node ptr;
        for (ptr = head;ptr.next!=null;ptr = ptr.next)
        {
            if(ptr.next.value < min.value)
            {
                min = ptr.next;
                beforeMin = ptr;

            }
        }
            if(min != head)
                {swapNodes(head, head, min, beforeMin);}
            head.next = selectionSort(head.next);
            return head;

        }
    public void swapNodes(Node head, Node currX, Node currY, Node prevY)
    {
        // make 'currY' as new head
        head = currY;
        // adjust links
        prevY.next = currX;

        // Swap next pointers
        Node temp = currY.next;
        currY.next = currX.next;
        currX.next = temp;

    }
    }

强文

1 个答案:

答案 0 :(得分:0)

正如您已经确定的那样,在Java中,您无法将函数传递给函数,以便函数可以修改引用本身。 head中的selectionSort是对象的引用。将head传递到swapNodes后,它会传入对象的引用,而不是head中对selectionSort的引用。因此,当您在head中为swapNodes分配内容时,您不会更改head中的selectionSort

处理此问题的两种方法:

选项1:使head成为类的属性(成员),而不是swapNodes的参数。然后可以从两种方法访问head变量本身。

public class YourClass {
    private Node head;

    public Node selectionSort { . . . }

    public void swapNodes { . . . }
}

选项2:创建一个包含head作为成员的对象,并在任何地方使用该对象,包括将其作为参数传递。

在像你这样的情况下,选项1是显而易见的选择。