反转链表(递归与双指针)
题目描述
反转一个单链表。
示例
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
分析
这道题可以用递归,从最后一个结点,往链表头的方向逐步改变指向,非常简单
先看代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
/*
* 递归
* 理解cur这个点,cur是作为head的引用,cur始终指向末尾结点
* */
if(head==null) return head ; //出口
ListNode cur = null;
//到最后一个节点 - 出口
if (head.next==null)
return head ;
//入口
cur = reverseList(head.next) ;
//自底向上
head.next.next = head ;
head.next = null ;
return cur ;
}
}
核心操作
head.next.next = head ;
head.next = null ;
if(head==null) return head ; //出口
双指针
线性结构的算法,一定要去想到双指针这个策略
递归是自底向上的,很多人不理解,下面我们看看我们更适应的顺序方式,基于双指针
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
/*
* 双指针迭代
* */
ListNode pre = null;
ListNode cur = head;
while (cur!=null){
ListNode nextTemp = cur.next ;
cur.next = pre ;
pre = cur ;
cur = nextTemp ;
}
return pre ;
<