双向链表_如何通过Java单次查找链表的中间元素

双向链表

双向链表

您如何一次找到LinkedList的中间元素是一个编程问题,在电话采访中经常被问到Java和非Java程序员。 这个问题类似于检查回文计算阶乘,有时Interviewer还会要求编写代码。 为了回答这个问题,候选人必须熟悉LinkedList的数据结构,即在单个LinkedList的情况下,Linked List的每个节点都包含数据和指针,这是下一个Linked List的地址,而Singly Linked List的最后一个元素指向空值。 因为要找到链表的中间元素,您需要找到链表的长度,即计算元素的长度直到结束,即直到找到链表的最后一个元素。是什么使得这个数据结构面试问题有趣,是您需要找到inkedList的中间元素一口气,您不知道LinkedList的长度。

无论是否熟悉时空权衡等,这都是考生逻辑能力的考验之处。

就像您仔细考虑一样,您可以使用两个指针来解决此问题,如我上一篇有关如何查找Java中单链接列表的长度的文章中所述

通过使用两个指针,在每次迭代时增加一个,而在每第二次迭代中增加一个。 当第一个指针指向链接列表的末尾时,第二个指针将指向链接列表的中间节点。

实际上,这种两指针方法可以解决多个类似的问题,例如如何在一个迭代中从链表的最后一个查找第三个节点,或如何从链表的末个查找第N个元素。 在此Java编程教程中,我们将看到一个Java程序,该Java程序在一个迭代中找到“链表”的中间元素。

如何通过一遍查找LinkedList的中间元素

这是一个完整的Java程序,用于查找Java中“链表”的中间节点。 请记住,这里的LinkedList类是我们的自定义类,请勿将此类与java.util.LinkedList混淆,该类是Java中流行的Collection类。

在此Java程序中,我们的类LinkedList表示一个链表数据结构,该结构包含节点的集合并具有头和尾。

每个节点包含数据和地址部分。 主要方法LinkedListTest类用于模拟此问题,我们在其中创建了链表,并在链表上添加了一些元素,然后对其进行迭代以在Java中一次查找链表的中间元素。

import test.LinkedList.Node;

/**
 * Java program to find middle element of linked list in one pass.
 * In order to find middle element of a linked list 
 * we need to find the length first but since we can only 
 * traverse linked list one time, we will have to use two pointers
 * one which we will increment on each iteration while 
 * other which will be incremented every second iteration.
 * So when the first pointer will point to the end of a 
 * linked list, second will be pointing to the middle 
 * element of a linked list
 *
 * @author Javin Paul
 */
public class LinkedListTest {
  
  
    public static void main(String args[]) {
        //creating LinkedList with 5 elements including head
      LinkedList linkedList = new LinkedList();
      LinkedList.Node head = linkedList.head();
      linkedList.add( new LinkedList.Node("1"));
      linkedList.add( new LinkedList.Node("2"));
      linkedList.add( new LinkedList.Node("3"));
      linkedList.add( new LinkedList.Node("4"));
    
      //finding middle element of LinkedList in single pass
      LinkedList.Node current = head;
      int length = 0;
      LinkedList.Node middle = head;
    
      while(current.next() != null){
          length++;
          if(length%2 ==0){
              middle = middle.next();
          }
          current = current.next();
      }
    
      if(length%2 == 1){
          middle = middle.next();
      }

      System.out.println("length of LinkedList: " + length);
      System.out.println("middle element of LinkedList : "                                  + middle);
      
    } 
  
}

class LinkedList{
    private Node head;
    private Node tail;
  
    public LinkedList(){
        this.head = new Node("head");
        tail = head;
    }
  
    public Node head(){
        return head;
    }
  
    public void add(Node node){
        tail.next = node;
        tail = node;
    }
  
    public static class Node{
        private Node next;
        private String data;

        public Node(String data){
            this.data = data;
        }
      
        public String data() {
            return data;
        }

        public void setData(String data) {
            this.data = data;
        }

        public Node next() {
            return next;
        }

        public void setNext(Node next) {
            this.next = next;
        }
      
        public String toString(){
            return this.data;
        }
    }
}

Output:
length of LinkedList: 4
middle element of LinkedList: 2

一站式介绍如何查找LinkedList的中间元素。 正如我所说,这是一个很好的面试问题,可以将程序员与非程序员分开。 此外,此处提到的用于查找LinkedList中间节点的技术可用于从Last或LinkedList中最后一个元素的第n个元素。

如果您喜欢这篇文章,并且想尝试一些更具挑战性的编程练习,那么请看以下来自各种访谈的编程问题:

  • 如何检查LinkedList是否包含Java中的任何循环? ( 解决方案)
  • 如何在Java中搜索数组中的元素? ( 解决方案)
  • 如何使用冒泡排序算法对数组进行排序? ( 算法)
  • 如何在Java中计算数字的总和? ( 解决方案)
  • 编写程序来查找Java中String中的第一个非重复字符? ( 程序)
  • 如何在Java中检查数字是否为二进制? ( 回答)
  • 编写程序以检查数字是否为质数? ( 解决方案)
  • 如何防止Java死锁? ( 解决方案)
  • 如何在Java中找到数字的最大素数? ( 解决方案)
  • 如何在Java中使用递归计算阶乘? ( 算法)
  • 如何在Java中声明和初始化二维数组? ( 解决方案)
  • 编写一种方法来计算字符串中字符的出现次数? ( 解决方案)
  • 如何检查号码是否是阿姆斯特朗号码? ( 解决方案)
  • 编写一个程序,而不使用Collection API从数组中删除重复项? ( 程序)
  • 如何在不使用API​​方法的情况下反转Java中的String? ( 解决方案)
  • 写一个方法从Java中的ArrayList中删除重复项? ( 解决方案)
  • 编写程序以检查数字是否为回文? ( 程序)
  • 编写程序以检查数组是否包含重复的数字? ( 解决方案)
  • 如何找到不超过给定数字的斐波那契数列? ( 解决方案)
  • 编写程序以查找排序数组中的缺失数字? ( 算法)
  • 关于Java数组有10点? ( 必须知道事实)
  • 如何在Java中找到整数数组的前两个最大值? ( 解决方案)
  • 编写一种方法来检查两个String是否彼此为Anagram? ( 方法)
  • 如何找到数组中最大和最小的数字? ( 解决方案)
  • 编写函数一次找到链接列表的中间元素? ( 解决方案)
  • 如何解决Java中的生产者-消费者问题。 ( 解决方案)
  • 编写程序以检查数字是否为2的幂? ( 程序)

到目前为止,感谢您阅读此编码面试问题。 如果您喜欢这个String面试问题,请与您的朋友和同事分享。 如果您有任何问题或反馈,请发表评论。

翻译自: https://www.javacodegeeks.com/2019/03/middle-element-linked-list-java-single-pass.html

双向链表

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值