简体   繁体   English

如何确定双向链表中的数字是否在最大值和最小值之间?

[英]How can I find if a number in a doubly linked list is between max and min?

I want to create a method called inBetween that accepts an item as a parameter and returns true if the item is “in between” the smallest and largest list elements. 我想创建一个名为inBetween的方法,该方法接受一个项目作为参数,如果该项目在最小和最大列表元素之间,则返回true。 That is, based on the compareTo method defined for list elements, the item is larger than the smallest list element and smaller than the largest list element. 也就是说,基于为列表元素定义的compareTo方法,该项目大于最小的列表元素,并且小于最大的列表元素。 Otherwise, the method returns false (even if the item “matches” the smallest or largest element). 否则,该方法返回false(即使该项目“匹配”最小或最大元素)。

public class DoublyLinkedList {

private Link first;               // ref to first item
private Link last;                // ref to last item
// -------------------------------------------------------------

public DoublyLinkedList() // constructor
{
    first = null;                  // no items on list yet
    last = null;
}
// -------------------------------------------------------------

public boolean isEmpty() // true if no links
{
    return first == null;
}
// -------------------------------------------------------------

public void insertFirst(long dd) // insert at front of list
{
    Link newLink = new Link(dd);   // make new link

    if (isEmpty()) // if empty list,
    {
        last = newLink;             // newLink <-- last
    } else {
        first.previous = newLink;   // newLink <-- old first
    }
    newLink.next = first;          // newLink --> old first
    first = newLink;               // first --> newLink
}
// -------------------------------------------------------------

public void insertLast(long dd) // insert at end of list
{
    Link newLink = new Link(dd);   // make new link
    if (isEmpty()) // if empty list,
    {
        first = newLink;            // first --> newLink
    } else {
        last.next = newLink;        // old last --> newLink
        newLink.previous = last;    // old last <-- newLink
    }
    last = newLink;                // newLink <-- last
}
// -------------------------------------------------------------

public Link deleteFirst() // delete first link
{                              // (assumes non-empty list)
    Link temp = first;
    if (first.next == null) // if only one item
    {
        last = null;                // null <-- last
    } else {
        first.next.previous = null; // null <-- old next
    }
    first = first.next;            // first --> old next
    return temp;
}
// -------------------------------------------------------------

public Link deleteLast() // delete last link
{                              // (assumes non-empty list)
    Link temp = last;
    if (first.next == null) // if only one item
    {
        first = null;               // first --> null
    } else {
        last.previous.next = null;  // old previous --> null
    }
    last = last.previous;          // old previous <-- last
    return temp;
}
// -------------------------------------------------------------
// insert dd just after key

public boolean insertAfter(long key, long dd) {                              
// (assumes non-empty list)
    Link current = first;          // start at beginning
    while (current.dData != key) // until match is found,
    {
        current = current.next;     // move to next link
        if (current == null) {
            return false;            // didn't find it
        }
    }
    Link newLink = new Link(dd);   // make new link

    if (current == last) // if last link,
    {
        newLink.next = null;        // newLink --> null
        last = newLink;             // newLink <-- last
    } else // not last link,
    {
        newLink.next = current.next; // newLink --> old next
        // newLink <-- old next
        current.next.previous = newLink;
    }
    newLink.previous = current;    // old current <-- newLink
    current.next = newLink;        // old current --> newLink
    return true;                   // found it, did insertion
}
// -------------------------------------------------------------

public Link deleteKey(long key) // delete item w/ given key
{                              // (assumes non-empty list)
    Link current = first;          // start at beginning
    while (current.dData != key) // until match is found,
    {
        current = current.next;     // move to next link
        if (current == null) {
            return null;             // didn't find it
        }
    }
    if (current == first) // found it; first item?
    {
        first = current.next;       // first --> old next
    } else // not first
    // old previous --> old next
    {
        current.previous.next = current.next;
    }

    if (current == last) // last item?
    {
        last = current.previous;    // old previous <-- last
    } else // not last
    // old previous <-- old next
    {
        current.next.previous = current.previous;
    }
    return current;                // return value
}
// -------------------------------------------------------------

public void displayForward() {
    System.out.print("List (first-->last): ");
    Link current = first;          // start at beginning
    while (current != null) // until end of list,
    {
        current.displayLink();      // display data
        current = current.next;     // move to next link
    }
    System.out.println("");
}
// -------------------------------------------------------------

public void displayBackward() {
    System.out.print("List (last-->first): ");
    Link current = last;           // start at end
    while (current != null) // until start of list,
    {
        current.displayLink();      // display data
        current = current.previous; // move to previous link
    }
    System.out.println("");
}
// -------------------------------------------------------------

public DoublyLinkedList inBetween(long n) {

}
}  // end class DoublyLinkedList
////////////////////////////////////

public class InBetweenDemo
{
public static void main(String[] args)
  {                             // make a new list
  DoublyLinkedList theList = new DoublyLinkedList();

  theList.insertFirst(22);      // insert at front
  theList.insertFirst(44);
  theList.insertFirst(66);

  theList.insertLast(11);       // insert at rear
  theList.insertLast(33);
  theList.insertLast(55);

  theList.displayForward(); 
  int n=55;// display list forward
  System.out.println("inBetween("+n+") "+ inBetween(n));
  theList.displayBackward();    // display list backward

  theList.deleteFirst();        // delete first item
  n=55;
  System.out.println("inBetween("+n+") "+ theList.inBetween(n));

  theList.deleteLast(); 
  n=33;
  System.out.println("inBetween("+n+") "+ theList.inBetween(n));
  theList.deleteKey(22);        // delete item with key 11
  System.out.println("inBetween("+n+") "+ theList.inBetween(n));

  theList.displayForward();     // display list forward

  theList.insertAfter(11, 77);  // insert 77 after 22
  theList.insertAfter(33, 88);  // insert 88 after 33

  theList.displayForward();     // display list forward
  }  // end main()
}  // end class DoublyLinkedApp
////////////////////////////////////////////////////////////////

I was thinking that I could assign a max and min and then check if the parameter is less than and greater than each respective values. 我当时想我可以分配一个最大值和最小值,然后检查参数是否小于和大于各个值。 If it was then I would return true, if not return false. 如果是,那么我将返回true,否则将返回false。 I'm not sure how I would start the code of looking for the max and min in an unordered list. 我不确定如何开始在无序列表中查找最大值和最小值的代码。

There are two possible ways to solve your problem. 有两种方法可以解决您的问题。 (There might be other methods) (可能还有其他方法)

  1. You can make another method that will go through your linked list and find min and max . 您可以使另一种方法通过链接列表,并找到minmax And just call this method in your inBetween method. 只需在您的inBetween方法中调用此方法即可。 This method will have the worst case of O(n). 此方法将具有O(n)的最坏情况。 (If you are planning to do this then having a variable for min and max is not enough, you have to call the method every time you call inBetween since there is a possibility that the values have been updated) (如果您打算这样做,那么使用minmax变量是不够的,则每次调用inBetween时都必须调用该方法,因为可能会更新值)
  2. Have a variable for min and max then update it after every insert and delete. minmax一个变量,然后在每次插入和删除后对其进行更新。 It must be of type Link . 它必须是Link类型。 In insert it will just have the runtime of O(1) since you will just compare their values directly. 在插入中,它将仅具有O(1)的运行时,因为您将直接比较它们的值。 While in delete you will have to compare the key, if it has the same key then you have to find another min or max . 在删除时,您将必须比较密钥,如果密钥具有相同的密钥,则必须找到另一个minmax Thus you should also create a method to find min and max . 因此,您还应该创建一个找到minmax And in your inBetween method you will just have to get the variables min and max . inBetween方法中,您将只需要获取变量minmax There is no possibility that the values for min and max will update while executing inBetween since you are updating min and max every insert and delete. 在执行inBetweenminmax的值不可能更新,因为您要在每次插入和删除时都更新minmax

So there you go, just choose what you will implement from the two. 因此,您可以从这两个中选择要实现的目标。

Just iterate the list and make sure your item is less than at least one element and more than another: 只需对列表进行迭代,并确保您的商品少于至少一个元素且大于另一个元素:

public boolean inBetween(long n) {
    boolean less = false, more = false;
    for (Link current = first; current != null; current = current.next)
        if ((less |= n < current.dData) & (more |= n > current.dData))
            return true;
    return false;
}

I think you should create two variables, MAX and MIN firstly. 我认为您应该首先创建两个变量MAX和MIN。 After, run over the List and find the MAX and the MIN values. 之后,遍历列表并找到MAX和MIN值。 So, pick the value you want to campare and make the comparison. 因此,选择您想要的值并进行比较。 If the value is bigger than MIN and smaller than MAX, it is a valid number. 如果该值大于MIN且小于MAX,则为有效数字。 I sugest you add a variable called listLenght on the class of the List. 我建议您在List的类上添加一个名为listLenght的变量。 When you add something, update the variable listLenght. 添加内容时,更新变量listLenght。 When you remove, do the same. 删除时,请执行相同操作。

Iterate over the list to find the min and max values, then return true if the input value is greater than min and less than max : 遍历列表以查找minmax ,如果输入值大于min小于max ,则返回true:

public static boolean isBetween(List<Integer> list, int value){

    int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE;

    for (int i : list){

        if (i < min)
            min = i;

        if (i > max)
            max = i;
    }

    return value > min && value < max;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM