题目描述
输入一个链表,反转链表后,输出新链表的表头。
问题分析
要正确的反转链表,需要调整指针的方向,为了更好的描述分析这个过程,可以用图来说明。
(1)一个链表。
(2)把 2 节点之前的 next 都指向前一个节点,导致节点 2、3 之间断裂。
所以我们需要在节点 2 断裂之前,把节点 3 保存下来,总的来说,在调整节点 1 的next 指针时,除了要保存 1 本身,还需要知道 1 的前一个节点。同时还要保存 2 节点,所以我们需要定义三个指针。
public class Solution {
public ListNode ReverseList(ListNode head) {
ListNode pre = null; //pre 为当前节点的前一节点
ListNode next = null;//next 为当前节点的下一节点
if(head==null){ // head 为当前节点
return null;
}
while(head != null){
//1、先用 next 保存head的下一个节点的信息,保证单链表不会因为失去head节点的原next节点而就此断裂
next = head.next;
//2、保存完 next,就可以让 head 从指向 next 变成指向pre了(指针反向开始变了)
head.next = pre;
//3、head指向pre后,就继续依次反转下一个节点
//让pre,head,next依次向后移动一个节点,继续下一次的指针反转
pre = head;
head = next;
}
//如果 head 为 null 的时候,pre 就为最后一个节点了,
//但是链表已经反转完毕,pre 就是反转后链表的第一个节点
//直接输出 pre 就是我们想要得到的反转后的链表
return pre;
}
}
注意:对于这道题,至少要想到几种测试用例来检验:
1)输入的链头表指针是 null
- 输入的链表只有一个节点
3)输入的链表有多个节点
参考文献:https://www.nowcoder.com/questionTerminal/75e878df47f24fdc9dc3e400ec6058ca
来源:牛客网
网友评论