[剑指 Offer 24. 反转链表]
难度 简单
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
限制:
0 <= 节点个数 <= 5000
注意:本题与主站 206 题相同:https://leetcode-cn.com/problems/reverse-linked-list/
解法一:递归
class Solution {
ListNode headNew = null;
public ListNode reverseList(ListNode head) {
//如果该链表本身为空链表
if(head == null){
return null;
}
dfs(head);
return headNew;
}
private ListNode dfs(ListNode p) {
//判断是否到达表尾
if(p.next == null) {
headNew = p; //将表尾节点的值赋值给反转后的表头节点
p.next = null;
return p;
}else {
ListNode pre = dfs(p.next); //递归处理下一个节点
pre.next = p; //将该当前节点连接到最后一个节点后面
p.next = null; //赋值指针,避免指针异常
return p; //返回值为反转后已链接的节点中最后一个节点
}
}
}
解法二:双指针
class Solution {
public ListNode reverseList(ListNode head) {
ListNode pre = null;
ListNode cur = head;
while(cur != null) {
ListNode temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
}