• 反转链表


    题目:

      反转一个单链表。

    示例:

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

    准备工作,定义一个ListNode类,作为结点类型:

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

    解法一:头插法

      遍历给定的单链表,然后定义一个Listnode类型的辅助变量,每遍历到一个结点就将该结点赋值给辅助变量,然后指针变量向后移动,将辅助变量指向的结点插入到最前面。

        public ListNode reverseList(ListNode head) {
            
            if (head == null || head.next == null){
                return head;
            }
    
            ListNode p = head;
            ListNode q = null;
            ListNode temp = null;
            while (p!=null){
                
                temp = p;
                p = p.next;
                temp.next = q;
                q = temp;
            }
            return q;
        }

    解法二:递归解决

      反转就是将第一个结点变为最后一个结点,第二个结点变为倒数第二个结点,依次类推,那么可以可采用地递归的方式进行逐个的反转。我们可以将第一个结点后面的所有结点看成一个整体,那么反转就是将第一个结点和后面那个整体调换位置,同样,在这个整体的内部也需要进行反转,那么原始链表中的第二个结点,在当前的这个除第一个结点之外的整体内部算是第一个结点,继续上面的操作,可以达到逐层反转的目的。

    public ListNode reverseList(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode p = head.next;
        ListNode q = reverseList(p);
        p.next = head;
        head.next = null;
        return q;
    }
  • 相关阅读:
    vue(5)联动+tab页
    vue(4)hello world
    vue(3)IDE
    vue(2)创建项目
    vue(1)安装
    线程池(6)简单创建线程3种实现
    logback日志简记
    [省选前集训2021] 模拟赛2
    无标号无根树计数
    [省选前集训2021] 模拟赛1
  • 原文地址:https://www.cnblogs.com/yxym2016/p/13375416.html
Copyright © 2020-2023  润新知