zoukankan      html  css  js  c++  java
  • 单向链表反转

    比如有一个链表是这样的,1->2->3->4->5,反转后成为 5->4->3->2->1

    public class MyLinkedList {
    
        Node head;
        // 1->2->3->4->5
    
        // 最新添加的节点为head
        public void add(int obj) {
            Node newNode = new Node(obj);
            if (head == null) {
                head = newNode;
            } else {
                newNode.next = head;
                head = newNode;
            }
        }
    
        // 遍历时候,要新建一个引用first保存head。直接使用head会在遍历完后head的值被修改为null
        public void display() {
            Node first = head;
            StringBuilder sb = new StringBuilder();
            while (first != null) {
                sb.append(first.value + " -> ");
                first = first.next;
            }
            String res = sb.substring(0, sb.lastIndexOf(" -> "));
            System.out.println(res);
        }
    
        public static class Node {
    
            Node next;
            int value;
    
            public Node(int value) {
                super();
                this.value = value;
            }
        }
    
        //
        public void reverse() {
            // 如果头节点或者第二个节点是null,直接返回
            if (head == null || head.next == null) {
                return;
            }
            // 头节点设置为pre,第二个节点设置为当前节点,头节点的下一个设置为null,因为反转以后,头节点就成为最后一个节点了
            Node pre = head;
            Node cur = head.next;
            pre.next = null;
            while (cur != null) {
                // 将当前节点的下一个临时保存
                Node next = cur.next;
                // 当前节点的下一个指向pre
                cur.next = pre;
                // 进行下一轮的循环,当前节点变为下一个节点的next,当前节点右移
                pre = cur;
                cur = next;
            }
            // 重新调整head的指向
            head = pre;
        }
    
        // 这种写法和上面的都是相同的流程,只不过更加简洁
        public void reverse2() {
            Node pre = null;// 当前结点的前结点
            Node next = null;// 当前结点的后结点
            while (head != null) {// 从左到右,依次把->变为<-
                next = head.next;
                head.next = pre;// 当前结点指向前面的结点
                pre = head;// pre结点右移
                head = next;// head结点右移
            }
            this.head = pre;
        }
    
        public static void main(String[] args) {
    
            MyLinkedList linkedList = new MyLinkedList();
            linkedList.add(5);
            linkedList.add(4);
            linkedList.add(3);
            linkedList.add(2);
            linkedList.add(1);
            linkedList.display();
            linkedList.reverse2();
            linkedList.display();
        }
    
    }
  • 相关阅读:
    dddd
    asp.net web api rest风格与RPC风格调用
    使用ASP.NET WEB API文档来上传异步文件
    Fiddler2
    asp.net mvc3 局部页面@RenderBody @RenderPage@RenderSection使用方法详细说明
    paip.提升性能3倍使用栈跟VirtualAlloc代替堆的使用.
    paip.自适应网页设计 跟 响应式 设计的区别跟原理and实践总结
    paip.关于动画特效原理 html js 框架总结
    paip.utf8,unicode编码的本质输出unicode文件原理 python
    paip. 混合编程的实现resin4 (自带Quercus ) 配置 php 环境
  • 原文地址:https://www.cnblogs.com/moris5013/p/11629738.html
Copyright © 2011-2022 走看看