LC206. 反转链表

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
    }

 

posted @ 2023-05-18 13:03  RS_mine  阅读(19)  评论(0)    收藏  举报