剑指Offer(24)反转链表

目录

反转链表

描述

示例

限制

数据结构

方法一:迭代

方法二:递归


反转链表

描述

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

示例

输入

1->2->3->4->5->NULL

输出

5->4->3->2->1->NULL

限制

0 <= 节点个数 <= 5000

数据结构

public class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}

方法一:迭代

我们使用三个指针,分别指代当前指针的pre(前一个节点)、cur(当前节点)、next(当前节点的next节点)

然后从头节点开始遍历,将cur.next用next节点保存,接着将cur.next=pre,然后更新pre和cur(pre=next,cur=next),循环出口是cur为空节点。

class Solution {
    public ListNode reverseList(ListNode head) {
        if (head==null || head.next==null){
            return head;
        }
        ListNode pre=null;
        ListNode cur=head;
        ListNode next;
        while(cur!=null){
            next=cur.next;
            cur.next=pre;
            pre=cur;
            cur=next;
        }
        return pre;
    }
}

方法二:递归

用递归也比较好理解

反转一个节点的链表(1->null)我们直接返回节点本身即可(1->null )

反转两个节点(1->2->null)的我们先将后面的节点保存为next(2->null),然后将next.next=head(2->1->2->1->......),head.next=null即可( 2->1->null)

反转三个节点(1->2->3->null),我们假设已经得到了反转好的后两个节点(1->3->2->null),只需要将头节点放在尾部即可,我们可以将后两个节点(3->2->null)当作一个整体来看,这样问题就变成了反转两个节点,所以我们可以使用递归的方法解决该问题。

class Solution {
    public ListNode reverseList(ListNode head) {
        if (head==null||head.next==null) return head;
        ListNode next=head.next;
        ListNode reverse=reverseList(next);
        next.next=head;
        head.next=null;
        return reverse;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_39478524/article/details/120645931