使用栈,因为栈是先进后出的。实现原理就是把链表节点一个个入栈,当全部入栈完之后再一个个出栈,出栈的时候在把出栈的结点串成一个新的链表。
import java.util.Stack; public class Solution { public ListNode ReverseList(ListNode head) { Stack<ListNode> stack = new Stack<>(); //把链表的全部节点放入栈中 while (head !=null){ stack.push(head); head = head.next; } if (stack.isEmpty()) return null; ListNode node = stack.pop(); ListNode dummy = node; //栈中的结点全部出栈,然后重新连成一个新的链表 while (!stack.isEmpty()){ ListNode tempNode = stack.pop(); node.next = tempNode; node = node.next; } node.next = null; return dummy; }
使用双链表,双链表求解是把原链表的结点一个个摘掉,每次摘掉的链表都让他成为新的链表的头结点
public class Solution { public ListNode ReverseList(ListNode head) { //新链表 ListNode newHead = null; while (head != null) { //先保存访问的节点的下一个节点,保存起来 //留着下一步访问的 ListNode temp = head.next; //每次访问的原链表节点都会成为新链表的头结点, //其实就是把新链表挂到访问的原链表节点的 //后面就行了 head.next = newHead; //更新新链表 newHead = head; //重新赋值,继续访问 head = temp; } //返回新链表 return newHead; } }