Offer[24] 反转链表

Posted haoworld

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Offer[24] 反转链表相关的知识,希望对你有一定的参考价值。

题目描述

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

思路分析

  1. 利用三个指针,pre,p,pNext,将p的next指向前面的节点,注意反转之后的头节点。
  2. 头插法的思想,设置一个头结点,利用头插法建立链表

测试用例

  1. 功能测试:输入的链表含有多个节点;链表中只有一个节点。
  2. 特殊输入测试:链表头节点为nullptr指针。

Java代码

public class Offer24 
    public static void main(String[] args)     
        test1();
        test2();
        test3();
    

    public static ListNode ReverseList(ListNode head) 

        return Solution1(head);
    

    private static ListNode Solution1(ListNode head) 
        ListNode pReverseHead = null;
        ListNode pre = null;
        ListNode p = head;
        ListNode pNext = null;
        while (p != null) 
            pNext = p.next;
            if (pNext == null) 
                pReverseHead = p;
            
            p.next = pre;
            pre = p;
            p = pNext;
        
        return pReverseHead;
    

    /**
     * 利用头插法 的思想
     * 
     * @param head
     * @return
     */
    private static ListNode Solution2(ListNode head) 
        
        ListNode pHead = new ListNode(-1);// 设置一个头结点;
        pHead.next = null; // 头结点 next设置为null
        ListNode p = head;
        ListNode r = null; // 指向下一个节点
        while (p != null) 
            r = p.next;
            p.next = pHead.next;
            pHead.next = p;
            p = r;
        
        return pHead.next;
    

    private static void test1() 
        ListNode node1 = new ListNode(1);
        ListNode node2 = new ListNode(2);
        ListNode node3 = new ListNode(3);
        ListNode node4 = new ListNode(4);
        ListNode node5 = new ListNode(5);
        ListNode node6 = new ListNode(6);

        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node5;
        node5.next = node6;
        System.out.println("反转之前");
        ListNode.printListNode(node1);
        System.out.println("反转之后");
        ListNode reverseList = ReverseList(node1);
        ListNode.printListNode(reverseList);
    
    
    private static void test2() 
        ListNode node1 = new ListNode(1);
        System.out.println("反转之前");
        ListNode.printListNode(node1);
        System.out.println("反转之后");
        ListNode reverseList = ReverseList(node1);
        ListNode.printListNode(reverseList);
    
    
    private static void test3() 
        ListNode node1 = null;
        System.out.println("反转之前");
        ListNode.printListNode(node1);
        System.out.println("反转之后");
        ListNode reverseList = ReverseList(node1);
        ListNode.printListNode(reverseList);
    
    

代码链接

剑指Offer代码-Java

以上是关于Offer[24] 反转链表的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode]剑指 Offer 24. 反转链表

迭代之“反转链表”——剑指 Offer 24. 反转链表

迭代之“反转链表”——剑指 Offer 24. 反转链表

剑指Offer打卡24.反转链表

剑指Offer打卡24.反转链表

剑指Offer面试题24. 反转链表