我已经为swap
中linkedList
的{{1}}元素编写了代码。
目前,我的代码失败了,即它不是Java
个元素。我遇到了困难
关于如何处理这个问题。有什么提示吗?
swapping
答案 0 :(得分:3)
我解决这个问题的方法是
为最简单的情况,以正确的格式为linkedList
和所需的input
绘制output
。在这里,我将从4个节点开始;
然后解决简单的情况,例如ListNode
或next
为空
在纸上,标记已损坏的链接和已形成的链接。请注意,您必须按正确的顺序进行分解和链接;确保您reference
的{{1}}链接正在破坏。否则你可能会失去一些节点。这就是整个关键所在。在节点断开或形成链接时在每个步骤之后绘制。通过这种方式,您可以跟踪正在发生的事情;
将您在纸上绘制的内容翻译成代码。那一定相当简单! 通常你需要有临时指针来遍历列表;
在此示例中,需要更改nodes
或front
指针。所以我会在迭代之外进行第一次交换。我将在head
内进行剩余的更改。
编写一个方便的while loop
方法,可以帮助您跟踪每个阶段的变量。我发现toString
和debuggers
使用recusions
更加困难。但那只是我。
关于这个问题的解决方案:在我看来,这不是一个简单的问题。但是要好好掌握linkedLists
Pointers`
这是我的解决方案:
linkedLists and
答案 1 :(得分:1)
回答这样的问题的最佳方法是在列表进行迭代过程中可视化列表的状态。我用println实现了代码来帮助解决这个问题。另一种选择是包含更容易跟踪的变量名称,而temp
和dummy
不会阻止您实现更难以遵循的正确性。
这是功能
public ListNode switchPairs(){
if (this==null || this.next==null)
return this;
ListNode top = this.next;
ListNode first = this;
ListNode second = first.next;
do {
ListNode third = second.next;
second.next = first;
first.next = third;
first = third;
System.out.println("@@@ " + top.toString());
if (first != null) {
// remember second now is really the first element on the list
// at this point.
second.next.next = first.next;
second = first.next;
}
} while(first != null && second != null);
return top;
}
这是整个代码
public class ListNode {
private ListNode next = null;
private final int i;
ListNode(int i) {
this.i = i;
}
ListNode(int i, ListNode parent) {
this(i);
parent.next = this;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("[" + this.i + "]");
if (this.next != null) {
sb.append("->");
sb.append(this.next.toString());
}
return sb.toString();
}
public static void main(String[] args) {
ListNode top = null;
ListNode curr = null;
for(String arg : args) {
int i = Integer.parseInt(arg);
if(curr == null)
curr = new ListNode(i);
else
curr = new ListNode(i, curr);
if( top == null)
top = curr;
}
System.out.println(top.toString());
top = top.switchPairs();
System.out.println(top.toString());
}
public ListNode switchPairs(){
if (this==null || this.next==null)
return this;
ListNode top = this.next;
ListNode first = this;
ListNode second = first.next;
do {
ListNode third = second.next;
second.next = first;
first.next = third;
first = third;
System.out.println("@@@ " + this.toString());
if (first != null) {
second.next.next = first.next;
second = first.next;
}
} while(first != null && second != null);
return top;
}
}
最后但并非最不重要的一个示例输出
java ListNode 1 2 3 4 5 6 7 8
[1]->[2]->[3]->[4]->[5]->[6]->[7]->[8]
@@@ [2]->[1]->[3]->[4]->[5]->[6]->[7]->[8]
@@@ [2]->[1]->[4]->[3]->[5]->[6]->[7]->[8]
@@@ [2]->[1]->[4]->[3]->[6]->[5]->[7]->[8]
@@@ [2]->[1]->[4]->[3]->[6]->[5]->[8]->[7]
[2]->[1]->[4]->[3]->[6]->[5]->[8]->[7]
答案 2 :(得分:1)
public void switchPairs() {
ListNode prev = front;
if(front!=null && front.next != null) {
ListNode temp = front;
front = front.next;
temp.next = front.next;
front.next = temp;
prev = temp;
}
while(prev !=null && prev.next != null && prev.next.next != null) {
ListNode first_node =prev.next;
ListNode second_node = first_node.next;
first_node.next = second_node.next;
second_node.next = first_node;
prev.next = second_node;
prev = first_node;
}
}
答案 3 :(得分:0)
// Recursive solution
public void switchPairs(SingleLinkListNode prev, SingleLinkListNode node) {
if (node == null || node.next == null) {
return;
}
SingleLinkListNode nextNode = node.next;
SingleLinkListNode temp = nextNode.next;
nextNode.next = node;
node.next = temp;
if (prev != null) {
prev.next = nextNode;
} else {
head = nextNode;
}
switchPairs(node, node.next);
}
答案 4 :(得分:0)
我有这个递归函数,它有效:
public void swap2List(){
root = swap2List(root); //pass the root node
}
private Node swap2List(Node current){
if(current == null || current.next == null){
return current;
}
else{
Node temp = current;
Node temp2 = current.next.next;
current = current.next;
current.next = temp;
temp.next = swap2List(temp2);
}
return current;
}
答案 5 :(得分:-1)
public static LinkedList<Integer> switchPairs(LinkedList list) {
ListIterator<Integer> iterator = list.listIterator();
LinkedList<Integer> out = null;
while (iterator != null && iterator.hasNext()) {
if (out == null) {
out = new LinkedList<Integer>();
}
int temp = iterator.next();
if (iterator.hasNext()) {
out.add(iterator.next());
out.add(temp);
}else{
out.add(temp);
}
}
return out;
}