版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/PZHU_CG_CSDN/article/details/82182558
题目描述:
输入一个链表,反转链表后,输出新链表的表头。
时间限制:1秒
空间限制:32768K
方法一:先把所有节点全部取出来,再来重构链表。
import java.util.ArrayList;
import java.util.List;
public class Solution {
public ListNode ReverseList(ListNode head) {
List<ListNode> list = new ArrayList<>();
while (head != null) {
list.add(head);
head = head.next;
}
ListNode temp = null,newHead = null;
//防止越界。
if (list.size() == 0) {
return newHead;
}
temp = newHead = list.get(list.size()-1);
for (int i = list.size()-2;i >= 0;i--) {
temp.next = list.get(i);
temp = temp.next;
if(i == 0) {
temp.next = null;
}
}
return newHead;
}
}
方法二:在第一次遍历链表后、获取节点数据时就进行重构操作。
public class Solution {
public ListNode ReverseList(ListNode head) {
ListNode pre = null;
ListNode next = null;
while (head != null) {
next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
}
只要能知道当前节点的前一个节点就能够将链表翻转,所以用 pre 来保存前一个节点,然当前节点的 next 指向上一个节点(翻转操作),然后再更新节点信息,这样操作只多开辟了两个节点,不会浪费太多的空间。