题目信息
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
思路分析,通过图可以知道,要使这个链表反转,只需要让当前节点的next指向前一个节点就能实现链表的反转,于是就可以通过双指针解决这个问题,让指针pre 和 cur 移动直到cur ==null时,pre所指向的节点成为新链表的新的头节点,反转结束.
1.通过使用双指针的代码如下:
//双指针解决
class Solution {
public ListNode reverseList(ListNode head) {
//定义temp变量存放 cur.next
ListNode temp;
ListNode pre = null;
ListNode cur = head;
while(cur!=null){
temp = cur.next;
cur.next = pre;
//更新指针pre和cur
pre =cur;
cur = temp;
}
return pre;
}
}
2.当然也可以使用递归解决反转链表,实际操作和双指针方法大致一样,理解了双指针方法,递归就更好理解了,代码实现如下:
class Solution{
public ListNode reverseList(ListNode head){
return reverse(null,head);
}
//写一个方法来进行链表反转
public ListNode reverse(ListNode pre,ListNode cur){
//如果cur指针为null,说明链表反转完成
if(cur == null){
return pre;
}
ListNode temp = null;
temp = cur.next;
cur.next = pre;
//通过递归更新指针pre和cur
return reverse(cur,temp);
}
}