题目描述
面试题24. 反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
解法
1.双指针法
思路
借助两个指针,cur、pre,分别指向当前节点和前一个节点。
- 从null节点开始,这样可以避免第一个节点特殊处理,引入判断
- 设置一个tmp指针,用于保存后序节点的信息
- pre节点后继节点修改,实现局部逆序
- 更新pre、cur两个节点,向前推进两个节点。
代码
public ListNode reverseList(ListNode head) {
ListNode cur=null, pre = head;
ListNode tmp=null;
while(pre!=null){
tmp = pre.next;
pre.next = cur;
cur = pre;
pre = tmp;
}
return cur;
}
2.递归法
思路
采用递归自底向上的思路,构造逆序链表。先递归到最后一个节点,再先上回溯返回head节点。此外,它的返回值,在递归的过程中它的返回值一直没有改变,一直是最底层的的res指针。
代码
public ListNode reverseList(ListNode head) {
return dfs(head);
}
public ListNode dfs(ListNode cur){
if(cur == null || cur.next == null)
return cur;
ListNode res = dfs(cur.next);
cur.next.next = cur;
cur.next = null;
return res;
}