【整理】206反转链表

215 阅读1分钟

题目

leetcode-cn.com/problems/re… 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

思路

这题就比较简单明了,双指针、快慢指针实现吧。

就是先慢指针指向null,快指针指向头,让快指针next指向slow,然后一起前进,

代码

    public ListNode reverseList(ListNode head) {
        ListNode fast = head,slow =null;
        while(fast != null){
            ListNode temp = fast.next;
            fast.next = slow;
            slow = fast;
            fast = temp;
        }
        return slow;

    }
}

还可以用递归,递归很难想,觉得双指针就简单明了。其实这一块可以这样看,明确递归的功能:就是反转链表,第四行代码就是head之后进行反转,反转之后让它的next指向头结点,头结点的next指向null,就实现了反转

    public ListNode reverseList(ListNode head) {
        // 边界条件
        if(head == null || head.next == null){
            return head;
        }
        // 1)递,自前向后,先到链表最后一个节点,记为ret
// 2)归,自后向前,让下一节点的next指向当前,当前next指向null,实现反转
// 3)完成链表反转
// 返回值就是ret

        ListNode ret = reverseList(head.next);
        head.next.next=head;
        head.next=null;
        // ListNode(head.next);
        return ret;
    }
}