反转链表题型分析(包含简单与中等难度两种,附带流程图分析)

一、反转链表一(简单)

(一)、题目要求

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

(二)、解法

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

(三)、测试用例

public class Test {
    
    public static void main(String[] args) {
        // 空链表测试
        ListNode empty = null;
        empty = Solution.reverseList(empty);
        System.out.println("空链表测试");
        show(empty);

        // 一个节点链表测试
        ListNode one = new ListNode(1);
        one = Solution.reverseList(one);
        System.out.println("一个节点链表测试");
        show(one);

        // 两个节点链表测试
        ListNode two = new ListNode(1);
        two.next = new ListNode(2);
        two = Solution.reverseList(two);
        System.out.println("两个节点链表测试");
        show(two);

        // 正常链表测试
        ListNode list = new ListNode(1);
        list.next = new ListNode(2);
        list.next.next = new ListNode(3);
        list = Solution.reverseList(list);
        System.out.println("正常链表测试");
        show(list);
    }

    private static void show(ListNode node) {
        while (node != null) {
            System.out.println(node.val);
            node = node.next;
        }
    }
}

(四)、流程图分析

1、初始状态:
在这里插入图片描述
2、设立pre节点与current节点
在这里插入图片描述
3、第一次开始反转节点指向
在这里插入图片描述
4、第二次开始反转节点指向
在这里插入图片描述
5、反转结束
在这里插入图片描述

二、反转链表二(中等)

(一)、题目要求

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明:
1 ≤ m ≤ n ≤ 链表长度。

示例:

输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL

(二)、解法

public class Solution {

    public static ListNode reverseBetween(ListNode head, int m, int n) {
        if (head == null || m > n) {
            return head;
        }
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        head = dummy;
        for (int i = 1; i < m; i++) {
            head = head.next;
        }
        ListNode preM = head;
        ListNode mNode = head.next;
        ListNode nNode = mNode;
        ListNode postN = nNode.next;
        for (int i = m; i < n; i++) {
            ListNode next = postN.next;
            postN.next = nNode;
            nNode = postN;
            postN = next;
        }
        preM.next = nNode;
        mNode.next = postN;
        return dummy.next;
    }
}

(三)、测试用例

public class Test {

    public static void main(String[] args) {
        // 空链表测试
        ListNode empty = null;
        empty = Solution.reverseBetween(empty, 1, 1);
        show(empty);

        // 一个节点链表测试
        ListNode one = new ListNode(1);
        one = Solution.reverseBetween(one, 1, 1);
        System.out.println("一个节点链表测试");
        show(one);

        // 两个节点链表测试
        ListNode two = new ListNode(1);
        two.next = new ListNode(2);
        two = Solution.reverseBetween(two, 1, 2);
        System.out.println("两个节点链表测试");
        show(two);

        // 正常链表测试
        ListNode list = new ListNode(1);
        list.next = new ListNode(2);
        list.next.next = new ListNode(3);
        list.next.next.next = new ListNode(4);
        list.next.next.next.next = new ListNode(5);
        list = Solution.reverseBetween(list, 1, 4);
        System.out.println("正常链表测试");
        show(list);

        // m>n的参数测试
        list = Solution.reverseBetween(list, 4, 2);
        System.out.println("m>n的参数测试");
        show(list);

        // 从head节点开始进行反转
        list = Solution.reverseBetween(list, 1, 4);
        System.out.println("从head节点开始进行反转");
        show(list);
    }

    private static void show(ListNode node) {
        while (node != null) {
            System.out.println(node.val);
            node = node.next;
        }
    }
}

(四)、流程图分析

1、初始状态

在这里插入图片描述
2、设立dummy节点,并head指向dummy
在这里插入图片描述
3、寻找到mNode、nNode等节点的初始位置
在这里插入图片描述
4、开始反转
在这里插入图片描述
5、反转结束
在这里插入图片描述
6、调整next指针位置
在这里插入图片描述
7、重新排版位置
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值