zoukankan      html  css  js  c++  java
  • 7.查找单链表中的中间结点

    题目分析:

           链表的特点就是有很多的节点,每个节点有数据域和指针域两部分,指针域存放的是下一个节点的地址,根据地址找到下一个节点。链表只能从前到后遍历,不能从后到前遍历。

           对于这个问题,我们首先能够想到的就是先遍历一遍整个的链表,然后计算出链表的长度,进而遍历第二遍找出中间位置的数据。这种方式非常简单。

           若题目要求只能遍历一次链表,那又当如何解决问题?可以采取建立两个指针,一个指针一次遍历两个节点,另一个节点一次遍历一个节点,当快指针遍历到空节点时,慢指针指向的位置为链表的中间位置,这种解决问题的方法称为快慢指针方法。(面试尽量用这种方式,能够提高印象分)

        // 方法:查找链表的中间结点 
        public Node findMidNode(Node head) {
            if (head == null) {
                return null;
            }
            Node first = head;
            Node second =head;
            // 每次移动时,让second结点移动两位,first结点移动一位 
            while (first != null && second != null) {
                first = first.next;
                second = second.next.next;
    
            }
            return first;
        }

    测试代码:

        public static void main(String[] args) {
            LinkList list = new LinkList();
            // 向LinkList中添加数据
            for (int i = 0; i < 10; i++) {
                list.add(i);
            }
            list.print(list.head);// 从head节点开始遍历输出
            System.out.print(list.getLength(list.head));
            System.out.print("
    ");
    //        System.out.print(list.findLastNode(10));
            System.out.print(list.findLastNode(list.head,7).getData());
            System.out.print("
    ");
            System.out.print(list.findMidNode(list.head).data);
            
        }
  • 相关阅读:
    (C/C++学习笔记) 五. 常变量(只读变量)和宏
    (C/C++学习笔记) 四. 运算符
    (C/C++学习笔记) 三. 作用域和可见性
    (C/C++学习笔记) 一. 基础知识
    计算机科学的基本术语及其英语表达
    模块与包
    Python的递归
    内置函数与匿名函数
    装饰器,迭代器,生成器分析
    命名关键字参数,函数对象,嵌套,名称空间与作用域,闭包
  • 原文地址:https://www.cnblogs.com/guweiwei/p/6855446.html
Copyright © 2011-2022 走看看