[英]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)
(可能还有其他方法)
min
and max
. min
和max
。 And just call this method in your inBetween
method. inBetween
方法中调用此方法即可。 This method will have the worst case of O(n). 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) min
和max
变量是不够的,则每次调用inBetween
时都必须调用该方法,因为可能会更新值) min
and max
then update it after every insert and delete. min
和max
一个变量,然后在每次插入和删除后对其进行更新。 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. min
or max
. min
或max
。 Thus you should also create a method to find min
and max
. min
和max
。 And in your inBetween
method you will just have to get the variables min
and max
. inBetween
方法中,您将只需要获取变量min
和max
。 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. inBetween
, min
和max
的值不可能更新,因为您要在每次插入和删除时都更新min
和max
。 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
: 遍历列表以查找
min
和max
,如果输入值大于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.