定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof
解法一 双指针
分析
定义两个指针: cur 和 pre
每次让 cur 的 next 指向 pre ,实现一次局部反转
局部反转完成之后, pre 和 cur 同时往前移动一个位置
循环上述过程,直至 cur 到达链表尾部
代码
class Solution {public ListNode reverseList(ListNode head) {ListNode cur = head;ListNode prev = null;while(cur!=null){ListNode temp = cur.next;cur.next = prev;prev = cur;cur = temp;}return prev;}}
方法二 递归
分析
使用递归函数,一直递归到链表的最后一个结点,该结点就是反转后的头结点,记作 newhead
此后,每次函数在返回的过程中,让当前结点的下一个结点的 next 指针指向当前节点。
同时让当前结点的 next 指针指向 NULL ,从而实现从链表尾部开始的局部反转
当递归函数全部出栈后,链表反转完成。
代码
class Solution {public ListNode reverseList(ListNode head) {if (head == null || head.next == null) {return head;}ListNode newHead = reverseList(head.next);head.next.next = head;head.next = null;return newHead;}}
