如何将给定的单向链表反转变成一个新的单向链表.
例:
原链表: Head -> 1 -> 2 -> 3 -> 4 -> 5 -> null
目标链表: Head -> 5 -> 4 -> 3 -> 2 -> 1-> null
这个题目很容易实现,可以用数组转存,在逆序遍历数组;也可以使用递归,更可以暴力遍历.但这些都不是最优的,数组和递归都需要额外的存储空间;暴力遍历需要多次遍历,时间复杂度不是最优的.
下面分享两种比较省空间的方法:
1. 从原链表的头部一个一个取节点并插入到新链表的头部.
2. 每次都将原第一个结点之后的那个结点放在新的表头后面.
两种算法的思想是一致的,都是通过指针偏移做标记处理,其中一个指向新的单向链表,一个指向原链表节点;
而且两种算法也都只需要额外两指针就能达到目的;
如果你自己动手写代码的话,你会发现方法基本是相同的
附上代码,仅供参考:
public class ReverseLinkListNode {
static Node reverse(Node head) {
Node nextNode = head;
Node firstNode = null;
while (nextNode != null) {
Node n = nextNode;
nextNode = n.next;
n.next = firstNode;
firstNode = n;
}
return firstNode;
}
static String print(Node head) {
StringBuilder sb = new StringBuilder("Head->");
Node p = head;
while (p != null) {
sb.append(p.data).append("->");
p = p.next;
}
sb.append("null");
return sb.toString();
}
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;
System.out.println(print(node1));
System.out.println(print(reverse(node1)));
}
}
class Node {
int data;
Node next;
public Node(int data) {
this.data = data;
}
public String toString() {
return "Node{" +
"data=" + data +
", next=" + next +
'}';
}
}