单链表反转
package com.donews.frame.camera;
/**
* Created by Comers on 2018/12/9.
* 描述:
*/
public class Reverse {
public static void main(String[] args) {
Node node1 = new Node(1);
Node node2 = new Node(2);
Node node3 = new Node(3);
Node node4 = new Node(4);
Node node5 = new Node(5);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
// reverse(node1);
System.out.print(reverse2(node1));
}
public static Node reverse(Node node) {
if (node.next == null) {
return node;
}
Node temp = null;
Node next;
while (node != null) {
next = node.next;
node.next = temp;
temp = node;
node = next;
System.out.println("temp--->" + temp);
System.out.println("node--->" + node);
}
return temp;
}
public static Node reverse2(Node node) {
if (node.next == null) {
return node;
}
Node pre = reverse2(node.next);
Node temp = node.next;
temp.next=node;
node.next=null;
System.out.println("pre--->" + pre);
return pre;
}
public static class Node {
public Node(int data) {
this.data = data;
}
int data;
Node next;
@Override
public String toString() {
return "Node{" +
"data=" + data +
", next=" + next +
'}';
}
}
}
-
reverse()结果
temp--->Node{data=1, next=null} node--->Node{data=2, next=Node{data=3, next=Node{data=4, next=Node{data=5, next=null}}}} temp--->Node{data=2, next=Node{data=1, next=null}} node--->Node{data=3, next=Node{data=4, next=Node{data=5, next=null}}} temp--->Node{data=3, next=Node{data=2, next=Node{data=1, next=null}}} node--->Node{data=4, next=Node{data=5, next=null}} temp--->Node{data=4, next=Node{data=3, next=Node{data=2, next=Node{data=1, next=null}}}} node--->Node{data=5, next=null} temp--->Node{data=5, next=Node{data=4, next=Node{data=3, next=Node{data=2, next=Node{data=1, next=null}}}}} node--->null Node{data=5, next=Node{data=4, next=Node{data=3, next=Node{data=2, next=Node{data=1, next=null}}}}}
-
reverse2()结果
pre--->Node{data=5, next=Node{data=4, next=null}} pre--->Node{data=5, next=Node{data=4, next=Node{data=3, next=null}}} pre--->Node{data=5, next=Node{data=4, next=Node{data=3, next=Node{data=2, next=null}}}} pre--->Node{data=5, next=Node{data=4, next=Node{data=3, next=Node{data=2, next=Node{data=1, next=null}}}}} Node{data=5, next=Node{data=4, next=Node{data=3, next=Node{data=2, next=Node{data=1, next=null}}}}}
*从运行的结果不难看出,这两种方式的思想, 对于递归呢,可以说是走的V型结构,第一次拿到的是链表的最后一个,然后使他的指针指向前一个原素,我们第一种方式,则是通过指针的逐步后移把原素逐个和后面的断开,这样每次都会拿到断开后链表的第一个原素,然后让他指向前一个断开的原素,如此直到最后一个。
- 第一种方式的整个过程图,递归则刚好相反