题目描述
输入一个链表,反转链表后,输出新链表的表头。
示例1
输入
复制
{1,2,3,4,5}
返回值
复制
{5,4,3,2,1}
思路:可以将链表想成一个环:
因为当前链表的第一个节点反转后便是最后一个节点,此时,它的下一个节点是null;
所以现在我们可以设计三个节点:preNode记录当前节点的前一节点;
nextNode记录当前节点的后一节点;
head代表当前节点;
1.第一步首先判断给定的链表以及它的下一节点是否为空,如果为空的话,直接返回;
2.如果不为空,我们开始遍历链表;
3.将当前链表的下一节点保存,以免链表终断;
然后将该节点的前一节点移到该节点的后面;
然后前节点后移指向当前节点;
当前节点后移指向下一节点;
重复以上过程,直至链表遍历结束;
模拟一下过程:
preNode: | |
head: | |
nextNode: |
第一次循环:
nextNode: | |
head: | |
preNode: | |
head: |
第二次循环:
nextNode: | |
head: | |
preNode: | |
head: |
第三次循环:
nextNode: | |
head: | |
preNode: | |
head: |
第四次循环:
nextNode: | |
head: | |
preNode: | |
head: |
第五次循环:
nextNode: | |
head: | |
preNode: | |
head: |
可以看出preNode便是最终翻转后的链表。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
import java.util.*;
public class Solution {
public ListNode ReverseList(ListNode head) {
// 判断当前链表及下一节点是否为空,如果为空,直接返回
if (head==null || head.next==null) {
return head;
}
// 设置两个节点:preNode: 存储当前节点的前一节点,初始值为null;
// nextNode: 存储当前节点的后一节点;
ListNode preNode = null;
ListNode nextNode = null;
// 遍历链表
while (head != null) {
// 存储之后的节点
nextNode = head.next;
// pre节点放在当前节点后面
head.next = preNode;
// pre节点后移
preNode = head;
// 当前节点后移
head = nextNode;
}
// 这时候preNode存储的便是翻转后的节点
return preNode;
}
}