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

    题目描述

    输入一个链表,反转链表后,输出链表的所有元素。

    public class Test {
        
        class ListNode {
            int value;
            ListNode next;
            public ListNode(int value) {
                this.value = value;
            }
        }
        
        public static void main(String[] args) {
            Test t = new Test();
            ListNode node1 = t.new ListNode(1);
            ListNode node2 = t.new ListNode(2);
            ListNode node3 = t.new ListNode(3);
            ListNode node4 = t.new ListNode(4);
            ListNode node5 = t.new ListNode(5);
            ListNode node6 = t.new ListNode(6);
            ListNode node7 = t.new ListNode(7);
            node1.next = node2;
            node2.next = node3;
            node3.next = node4;
            node4.next = node5;
            node5.next = node6;
            node6.next = node7;
            node7.next = null;
            ListNode reverse = t.reverseList(node1);
            while(reverse != null) {
                System.out.println(reverse.value);  // 打印反转链表
                reverse = reverse.next;
            }
        }    
        
        /**
         * 在调整当前处理结点的下一结点之前,将当前处理结点的下一结点保存。
         * 也就是需要三个指针,分别指向当前结点的前驱结点、当前节点和后一结点
         * @param head
         * @return
         */
        public ListNode reverseList(ListNode head) {
            if(head == null) return null;
            
            // 用于记录反转后的链表的头结点
            ListNode reverseNode = null;
            
            // 当前结点的前驱结点,也就是反转后的最后一个结点的下一结点,为null
            ListNode prev = null;
            
            // 当前处理的节点
            ListNode curr = head;
            while(curr != null) {
                
                // 记录当前处理结点的下一结点
                ListNode nextNode = curr.next;
                // 到达最后一个结点,也就是反转后的头结点
                if(curr.next == null) {
                    reverseNode = curr;
                }
                
                // 设置当前结点的下一结点指向前驱结点
                curr.next = prev;
                // 设置当前结点为前驱结点
                prev = curr;
                // 当前结点移动到下一个结点
                curr = nextNode;
            }
            
            return reverseNode;  // 返回反转链表头结点        
        }
    }
  • 相关阅读:
    排序数据记录查询
    条件数据记录查询
    简单数据记录查询
    缓冲流
    转换流
    删除数据记录
    更新数据记录
    插入数据记录
    移动前端自适应适配布局解决方案和比较
    如何解决inline-block元素的空白间距
  • 原文地址:https://www.cnblogs.com/zywu/p/5771042.html
Copyright © 2011-2022 走看看