如何在Java中重新排列LinkedList而不更改数据字段,只需重新排列链接?

如何在Java中重新排列LinkedList而不更改数据字段,只需重新排列链接?,java,Java,首先,我刚开始学习LinkedList,所以如果我说了一些关于它的话,我很抱歉,这是完全错误的。我有一个作业,我必须写一个方法来切换LinkedList的对。如果我有一个列表[3,7,4,9],它将在方法之后更改为[7,3,9,4]。我不允许更改节点的任何数据字段,也不能构造任何新节点。我想了解LinkedList是如何工作的。到目前为止,这就是我所拥有的: public void switchPairs() { if (front == null) return;

首先,我刚开始学习LinkedList,所以如果我说了一些关于它的话,我很抱歉,这是完全错误的。我有一个作业,我必须写一个方法来切换LinkedList的对。如果我有一个列表[3,7,4,9],它将在方法之后更改为[7,3,9,4]。我不允许更改节点的任何数据字段,也不能构造任何新节点。我想了解LinkedList是如何工作的。到目前为止,这就是我所拥有的:

public void switchPairs() {
    if (front == null)
        return;
    ListNode current = head;
    ListNode next = head.next;
    current.next = null;

    next.next = current;

}

现在我仍在试图找出如何交换前两个值。我的推理是,我可以将一个名为current的新ListNode变量分配给head,然后再将另一个名为next to head.next的新ListNode变量分配给head。然后我可以将current之后的节点分配为null。然后,该列表与我创建的下一个变量分开,我可以将下一个之后的节点指定为当前。但这不起作用。那么我该怎么做呢

您需要遵循以下步骤

1. While temp is not null && temp1 is not null
      1. Swap links of temp and temp1
      2. Move temp to temp1.next
      3. Move temp1 to temp.next if temp is not null 
                                 else make temp is null
交换两个节点链接如下所示。[开关对(温度、温度1)]

比方说

数据链接是我在这里使用的模式

temp = 3|linkX 

temp1 = 5|linkY

newTemp = temp = Points to the address of Temp

temp.link = 3|linkY [temp.link = temp1.link]

temp1.link = 5|AdrOfTemp [temp1.link = newTemp]

如果您仍然有疑问,请发布调用此函数的助手方法。我怀疑您可能没有切换临时节点。

您需要遵循以下步骤

1. While temp is not null && temp1 is not null
      1. Swap links of temp and temp1
      2. Move temp to temp1.next
      3. Move temp1 to temp.next if temp is not null 
                                 else make temp is null
交换两个节点链接如下所示。[开关对(温度、温度1)]

比方说

数据链接是我在这里使用的模式

temp = 3|linkX 

temp1 = 5|linkY

newTemp = temp = Points to the address of Temp

temp.link = 3|linkY [temp.link = temp1.link]

temp1.link = 5|AdrOfTemp [temp1.link = newTemp]

如果您仍然有疑问,请发布调用此函数的助手方法。我怀疑您可能没有切换临时节点。

请参考以下代码:

public void switchPairs() {
if (front == null)
    return;

ListNode current = head;
ListNode nextNode = head.next;
current.next = nextNode.next;
head = nextNode; 
head.next = current;
}

希望这个算法能帮助

  • 将头部节点分配到一个临时节点中
  • 将头部的下一个节点分配到另一个临时节点
  • 将步骤1的下一个节点替换为步骤2的下一个节点
  • 将步骤1中创建的节点分配给头部下一个节点
  • 将在步骤2中创建的节点分配给头部节点

  • 请参考以下代码:

    public void switchPairs() {
    if (front == null)
        return;
    
    ListNode current = head;
    ListNode nextNode = head.next;
    current.next = nextNode.next;
    head = nextNode; 
    head.next = current;
    
    }

    希望这个算法能帮助

  • 将头部节点分配到一个临时节点中
  • 将头部的下一个节点分配到另一个临时节点
  • 将步骤1的下一个节点替换为步骤2的下一个节点
  • 将步骤1中创建的节点分配给头部下一个节点
  • 将在步骤2中创建的节点分配给头部节点

  • 因为这是你的学校作业,我不会给你完整的答案。相反,我只针对以下要求编写解决方案,我希望,在这段代码的帮助下,您能够完成任务的其余部分

    现在我仍在想如何交换前两个 价值观

    注意事项:

  • 我已将返回类型从
    void
    更改为
    ListNode
    。你需要像这样称呼它
  • 从您创建链接列表的任何位置(例如,
    main
    )。无论您在何处创建了链表,都必须先创建
    head
    节点,然后向其中添加其他节点。调用
    开关对
    后,
    应指向原始链接列表中的第二个节点

  • 您应该将
    next
    声明为
    private
    并为其编写
    public
    getter和setter,如下所示:

  • 请注意,您的IDE只需点击几下就可以生成这两种方法。

    因为这是您的学校作业,所以我不会给出完整的解决方案。相反,我只针对以下要求编写解决方案,我希望,在这段代码的帮助下,您能够完成任务的其余部分

    现在我仍在想如何交换前两个 价值观

    注意事项:

  • 我已将返回类型从
    void
    更改为
    ListNode
    。你需要像这样称呼它
  • 从您创建链接列表的任何位置(例如,
    main
    )。无论您在何处创建了链表,都必须先创建
    head
    节点,然后向其中添加其他节点。调用
    开关对
    后,
    应指向原始链接列表中的第二个节点

  • 您应该将
    next
    声明为
    private
    并为其编写
    public
    getter和setter,如下所示:

  • 请注意,您的IDE只需单击几下就可以生成这两种方法。

    您正在用通用方法修改
    头部。如果OP想通过他的示例中的
    4,9
    ,此方法将改变
    head
    。这是交换前两个节点。是的,这是只交换前两个节点的例子,考虑到第一个节点是头节点。。。您可以使用相同的方法来交换其他对象您是希望实现整个实现,还是希望按照该算法进一步执行?因此,我的作业要求切换整个列表。所以基本上交换第一和第二个元素,然后交换第三和第四个元素,依此类推。但我想我会按照这个算法继续,谢谢!多亏了这个算法的帮助,我才能够解决作业。非常感谢。您正在用通用方法修改
    head
    。如果OP想通过他的示例中的
    4,9
    ,此方法将改变
    head
    。这是交换前两个节点。是的,这是只交换前两个节点的例子,考虑到第一个节点是头节点。。。您可以使用相同的方法来交换其他对象您是希望实现整个实现,还是希望按照该算法进一步执行?因此,我的作业要求切换整个列表。所以基本上交换第一和第二个元素,然后交换第三和第四个元素,依此类推。但我想我会按照这个算法继续,谢谢!我能解决这个作业
    public ListNode getNext() {
        return next;
    } 
    setNext(ListNode next) {
        this.next = next;
    }