代码如下所示:
public static ListNode reverseList(ListNode head) {
ListNode root = new ListNode();
root.next = null;
ListNode next;
while (head != null) {
next = head.next;
head.next = root.next;
root.next = head;
head = next;
}
return root.next;
}
现在对于上面的代码进行解析。
单链表具有单向性,也就决定了只能从上个节点找下个节点,不能直接从下个节点指向上个节点。
(1)时间复杂度为O(n),空间复杂度为O(n);
(2)时间复杂度为O(n),空间复杂度为O(1);
方法1:借助栈,数组等实现。
可以将每个链表的节点存储在栈或者数组等数据结构内,然后重组链表即可(数组反向取值)。
方法2:
思路:借助逻辑头节点实现。
新建一个空的逻辑头节点root,并赋null值给该节点的next。这样便新建好了一个新的链表,里面有两个“节点”,头节点是逻辑头节点root,下一个节点是null节点,并存在链接关系。循环遍历该链表,如果不为null,就将该节点取出,插入至新的链表头节点的后边,这样执行依次循环之后,新的链表便链接完成。