思路
- 都是一个思路,在遍历的过程中改变指针。
心路历程
递归卡住了,我想的是利用return来完成指针的修改,但这样拿不到整个反转链表的头
最后看的别人的,return专门用来传递反转链表的头
first.next = null;如果忽略,最后两个节点会不断循环
两指针
public static <T> Node<T> reverse1(Node<T> first) {
if(first == null)
return null;
Node<T> prev = null;
Node<T> next = first;
for (Node<T> node = first; node != null; node = next) {
next = node.next;
node.next = prev;
prev = node;
}
return prev;
}
// 反转链表 递归
public static <T> Node<T> reverse2(Node<T> first) {
if(first == null||first.next == null)
return first;
else {
// head代表整个队列的头,first是每次递归的头
Node<T> head = reverse2(first.next);
first.next.next = first;
first.next = null;
return head;
}
}
递归
// 反转链表 递归
public static <T> Node<T> reverse2(Node<T> first) {
if(first == null||first.next == null)
return first;
else {
// head代表整个队列的头,first是每次递归的头
Node<T> head = reverse2(first.next);
first.next.next = first;
first.next = null;
return head;
}
}
递归优化
// 反转链表 递归优化
public static <T> Node<T> reverse3(Node<T> first) {
if(first == null)
return null;
Stack<Node<T>> stack = new Stack<>();
for (Node<T> node = first;node!=null;node = node.next){
stack.push(node);
}
first = stack.pop();
Node<T> prev;
while(!stack.isEmpty()){
prev = stack.pop();
prev.next.next = prev;
System.out.println("item"+prev.item);
prev.next = null;
}
return first;
}
Node类
public class Node <T>{
Node<T> next;
Node<T> prev;
T item;
public Node() {
}
public Node(T item,Node<T> next) {
this.next = next;
this.item = item;
}
public Node(Node<T> prev,T item,Node<T> next) {
this.prev = prev;
this.item = item;
this.next = next;
}
// 最后返回的是item的toString
@Override
public String toString() {
return item.toString();
}
}