单链表逆转递归和迭代的实现,代码如下:
public class LinkReverse {
static class Node{
int data;
Node next;
public Node(int data, Node next) {
this.data = data;
this.next = next;
}
}
/**
* 递归的实现
* @param node
*/
private static Node reverseLink(Node node, Node prev) {
if(node.next == null) {
node.next = prev;
return node;
} else {
//该处比较难理解,这个是始终返回的第一个节点,一层层的向上传递
Node head = reverseLink(node.next, node);
node.next = prev;
return head;
}
}
/**
* 迭代的实现链表的逆转
* @return
*/
private static Node reverseLinkByIterate(Node node) {
Node prev = null;
Node now = node;
while(now != null) {
Node next = now.next;
now.next = prev;
prev = now;
now = next;
}
return prev;
}
public static void main(String[] args) {
Node node5 = new Node(5, null);
Node node4 = new Node(4, node5);
Node node3 = new Node(3, node4);
Node node2 = new Node(2, node3);
Node node1 = new Node(1, node2);
// Node node = reverseLinkByIterate(node1);
Node node = reverseLink(node1, null);
while(node != null) {
System.out.println(node.data);
node = node.next;
}
}
}
说明:
迭代的很好理解,递归的不太好理解,这里简单的说一下递归的思路吧
递归的思路其实是递归的先找到最后一个节点,完成最后一个节点的逆转,然后把最后一个节点一层层的向上传递,之前的节点一步步独立的实现逆转即可,最后返回最后一个节点,也就是头节点即可