Q:给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例:
示例1: 输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1] 示例2: 输入:head = [1,2] 输出:[2,1] 示例3: 输入:head = [] 输出:[]
提示:
- 链表中节点的数目范围是
[0, 5000]
-5000 <= Node.val <= 5000
A:思路:该题属于简单题,看到该题可能突然会有的思路是,反向遍历题目给的链表,并逐步创建一个一个新节点,进而生成一个新的符合题意的链表再返回其头结点,这样做虽可以达到目的,但是复杂度却高了。
其实拿到链表类的题,我们最应该想到的是:改变指针。那么有了这一想法,该题目就很容易去解决了,只要我们不断的更改相邻两个节点之间的指针的方向,使其变为反方向即可完成反转链表。
以下是Java代码,仅供参考:
双指针法
public ListNode reverseList(ListNode head) { if(head == null) return head; // 如果head为null,则不需反转,直接返回即可 ListNode cur = head; ListNode pre = null; while(cur != null){ ListNode temp = cur.next; // 用于存储cur的下一个节点,因为cur的next指针要更改方向了 cur.next = pre; // 更改指针方向 pre = cur; // pre前移,指向cur cur = temp; // cur前移,指向temp } }递归法
public ListNode reverseList(ListNode head) { if(head == null) return head; return reverse(null, head); } // 递归函数 public ListNode reverse(ListNode pre, ListNode cur){ if(cur == null) return pre; // 递归终止条件,当cur == null时,返回pre ListNode temp = cur.next; // 因为要改变指针方向,所以要提前存储cur.next cur.next = pre; // 改变指针方向 return reverse(cur, temp); // 等价于:pre = cur, cur = temp }
标签:pre,head,ListNode,cur,反转,链表,null,LC206 From: https://www.cnblogs.com/fxy0715/p/17411589.html