一、问题描述
现在给你一个单链表的头节点 head
,请你反转链表,并返回反转后的链表
示意图:
单链表的定义:
/**
* 下面给出的是单链表的定义
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
二、解决思路
单链表的反转实现是十分常见的一道面试题,是我们都必须要掌握的。我们的解决思路如下:
假设现在的链表是1→2→3→null,我们需要返回的链表是3→2→1→null
根据单链表的定义我们可以知道,每个节点都只保存了它下一个节点的指针next,而没有保存它前一个节点的指针,当链表进行反转后,每个节点的下一个节点就变成了它原来的前一个节点,比如原先是1→2→3→null,反转后就变成了3→2→1→null,因此我们需要事先保存每个节点的前一个节点,随后在我们遍历链表的过程中,需要将当前节点的next 指针改为指向它的前一个节点,当然,在我们修改next指针之前还必须先保存它的后一个节点,不然修改next指针后它的后一个节点就访问不到了,最后返回新的头节点。
三、代码实现
public ListNode reverseList(ListNode head) {
ListNode prev = null; //表示当前节点的前一个节点,初始值为null
ListNode temp = head; //表示当前节点,初始值为head
ListNode next; //表示当前节点的下一个节点
while(temp != null){
//先提前保存当前节点的下一个节点
next = temp.next;
//将当前节点的next指针指向当前节点的前一个节点
temp.next = prev;
//更新prev,即将temp赋值给prev
prev = temp;
//更新temp,即将next赋值给temp
temp = next;
}
return prev; //退出循环时temp为null,那么temp的前一个节点prev即为新的头结点
}