如何复制,以便通过在原始列表末尾按顺序重复它们来使列表大小加倍

时间:2018-12-07 22:23:23

标签: java

我正在尝试找出如何复制下面给出的此列表,任何寻求帮助的建议都会很可爱(下面是我的输出)

    public class k {
    private ListNode front;

    public k() {
        front = null;
    }

    public k(ListNode sentIn) {
        front = sentIn;
    }
    public void duplicate() {
        // ListNode head = front;
        ListNode temp = front;
        while (temp != null && temp.getNext() != null) {
            temp = temp.getNext();
        }
        ListNode head = front;
        while (head != null) {
            temp.setNext(new ListNode(head.getValue(), temp.getNext()));
            head = head.getNext();
        }
    }

    public class ListNode implements Linkable
{
    private Comparable listNodeValue;
    private ListNode nextListNode;

    public ListNode()
    {
        listNodeValue = null;
        nextListNode = null;
    }

    public ListNode(Comparable value, ListNode next)
    {
        listNodeValue=value;
        nextListNode=next;
    }

    public Comparable getValue()
    {
        return listNodeValue;
    }

    public ListNode getNext()
    {
       return nextListNode;
    }

    public void setValue(Comparable value)
    {
        listNodeValue = value;
    }

    public void setNext(Linkable next)
    {
        nextListNode = (ListNode)next;
    }
}

我的输出 原稿:1、5、3、4、7 调用重复项后:

1,5,3,4,7,1,5,3,4,7,7,4,3,5,1

预期输出: 1,5,3,4,7,1,5,3,4,7

2 个答案:

答案 0 :(得分:0)

复制节点后,在循环中执行temp = temp.next

(创建每个新节点时无需使用temp.getNext();其上方的循环可确保其为null。)

答案 1 :(得分:0)

在导航列表时,您正在修改列表。因此,您的循环将继续超出您的预期。也就是说,在循环开始时,您将头设为列表中的第一个,而将temp作为最后一个。然后在temp旁边添加一个next,这样当head变为temp(在列表的末尾)时,它将有一个next。

另外,在新的ListNode中添加temp.getNext()作为下一个顺序时,顺序也会相反。

如果您拍摄列表大小的快照,然后循环播放多次,则可能会起作用。

public void duplicate(ListNode front) {
    //ListNode head = front;
    ListNode temp = front;
    int size = 0;
    while (temp != null && temp.getNext() != null) {
        temp = temp.getNext();
        size++;
    }
    ListNode head = front;

    while (head != null && size-- >= 0) {
        temp.setNext(new ListNode(head.getValue(), null));
        temp = temp.getNext();
        head = head.getNext();
    }
}