• 【leetcode】206.Reverse Linked List


    206.Reverse Linked List

    Reverse a singly linked list.

    Tips:实现从尾到头打印一个链表。

    以下代码包括两张方法:

    ①使用栈实现,不改变原链表。先读入,后输出。典型的先进后出,可用栈来实现。

    ②改变原来链表的指针方向。

    package easy;
    
    import java.util.Stack;
    import easy.ListNode;
    
    public class L206ReverseLinkedList {
        /**
         * Definition for singly-linked list.
         * 
         * public class ListNode { int val; ListNode next; ListNode(int x) { val =
         * x; } }
         */
    
        public ListNode reverseList(ListNode head) {
            if (head == null)
                return head;
            Stack<Integer> myStack = new Stack<Integer>();
            ListNode pNode = head;
            while (pNode != null) {
                myStack.push(pNode.val);
                pNode = pNode.next;
            }
            int size = myStack.size();
            ListNode newHead = new ListNode(myStack.peek());
            myStack.pop();
            if (size == 1)
                return newHead;
            ListNode node = new ListNode(myStack.peek());
            newHead.next = node;
            myStack.pop();
            while (!myStack.empty()) {
                node.next = new ListNode(myStack.peek());
                myStack.pop();
                node = node.next;
            }
            return newHead;
        }
    
        public ListNode reverseList2(ListNode head) {
            // 通过改变链表的指针来从尾到头打印链表。
            if (head == null || head.next == null)
                return head;
            ListNode pre = null;
            ListNode cur = head;
            while (cur != null) {
                ListNode next = cur.next;
                cur.next = pre;
                pre = cur;
                cur = next;
            }
            return pre;
        }
    
        public void print(ListNode phead) {
            while (phead != null) {
                System.out.println(phead.val);
                phead = phead.next;
            }
        }
    
        public static void main(String[] args) {
            ListNode head1 = new ListNode(1);
            ListNode head2 = new ListNode(2);
            ListNode head3 = new ListNode(3);
            ListNode head4 = new ListNode(4);
            head1.next = head2;
            head2.next = head3;
            head3.next = head4;
            head4.next = null;
            L206ReverseLinkedList cc = new L206ReverseLinkedList();
            System.out.println("使用栈");
            ListNode p1 = cc.reverseList(head1);
            cc.print(p1);
            System.out.println("改变指针");
            ListNode p2 = cc.reverseList2(head1);
            cc.print(p2);
    
        }
    }
  • 相关阅读:
    关于Markdown
    20. 有效的括号(栈)
    数组队列
    MySql编码、卸载、启动问题
    循环队列
    链表实现与时间复杂度分析
    栈的应用和基本实现
    使用链表实现栈
    封装动态数组类Array
    Android平台的开发环境的发展演变
  • 原文地址:https://www.cnblogs.com/yumiaomiao/p/8391966.html
Copyright © 2020-2023  润新知