zoukankan      html  css  js  c++  java
  • 剑指OFFER24-反转链表

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

    示例:

    输入: 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;
            }
    }
    
    public ListNode reverseList(ListNode head) {
            //方法一:用栈来解决
            Stack<ListNode> stack = new Stack();
            //将节点全部放到栈中
            while (head != null) {
                stack.push(head);
                head = head.next;
            }
            //如果栈为空,返回null
            if (stack.isEmpty()) {
                return null;
            }
            //取出反转后的头节点
            ListNode node = stack.pop();
            //保留下来最后返回
            ListNode endHead = node;
            //当栈不为空时,取出节点
            while (!stack.isEmpty()) {
                ListNode tempNode = stack.pop();
                //连接下个节点
                node.next = tempNode;
                //将指针后移
                node = node.next;
            }
            //遍历完以后将最后节点的next指向null
            node.next = null;
            return endHead;
    }
    

    方法二:双链表

    public ListNode reverseList(ListNode head) {
            //方法二:双链表解决
            //new一个新的链表头节点
            ListNode newHead = null;
            while (head != null) {
                //首先保存访问节点的下一个节点
                ListNode temp = head.next;
                head.next = newHead;
                //更新新链表的头节点
                newHead = head;
                head = temp;
            }
            return newHead;
        }
    

    方法三:递归

    public ListNode reverseList(ListNode head) {
            //方法三:递归解决
            //终止条件是链表为空或者没有尾节点
            if (head == null || head.next == null) {
                return head;
            }
            //首先保存下一个节点
    //        ListNode next = head.next;
            //反转完之后,next是链表的尾节点,把head放在尾节点之后,
            //优化
            ListNode reverse = reverseList(head.next);
            head.next.next = head;
            head.next = null;
            return reverse;
        }
    
    public ListNode reverseList4(ListNode head) {
            //方法四:尾递归
            return reverseListInt(head, null);
        }
    
        private ListNode reverseListInt(ListNode head, ListNode newHead) {
            if (head == null)
                return newHead;
            ListNode next = head.next;
            head.next = newHead;
            return reverseListInt(next, head);
        }
    
  • 相关阅读:
    为你的 Github 博客加个 CMS -「内容管理」
    Alpha、Beta、RC、GA、LTS等软件各个版本号的含义
    WPF圆形进度条
    初试WPF代码迁移Core WPF
    dumpbin查看(Exe,Dll)是32位还是64位
    Windows Live Writer使用SyntaxHighlighter代码着色插件
    C#调用EnumDevice获取设备信息
    C#获取设备(Audio和Video)名称 简单整理
    C# Winform 换肤
    C# Winform模仿百度日历
  • 原文地址:https://www.cnblogs.com/jordan95225/p/13536651.html
Copyright © 2011-2022 走看看