从链表中删除具有最大值的节点

时间:2018-10-11 20:34:18

标签: java while-loop linked-list nodes singly-linked-list

我想从线性链接列表中删除具有最大通用T对象的Node(列表仅包含头部),然后返回该Node的对象。方法签名必须看起来像这样,以及我到目前为止得到的代码:

列表如下:

public List<T extends Comparable<T>>{

        private Node<T> head;

        public List(){
            this.head = null;
        }

        //inner class Node
        public class Node<T>{
            T obj;
            Node<T> next;
        }

        public Node(T obj){
            this.obj = obj;
        }
        //the method my question is about
        public T remove(){

            if(head == null) return null;

            else {

            Node<T> act = head;
            Node<T> prev = head //previous Node
            Node<T> biggest;

            while(act != null){
                if(act.obj.compareTo(prev.obj) > 0) {
                    biggest = act;
                }
                prev = p;
                p = p.next;
            }
            return biggest.obj;
        }
}

此代码仅获取最大的对象,而不删除节点。我不知道如何适应while循环来删除节点。如果我找到了最大的Element,则prev.next指针必须以某种方式转到act.next节点。

2 个答案:

答案 0 :(得分:0)

您的代码当前执行的操作是比较两个相邻的节点if(act.obj.compareTo(prev.obj),在这里我假设节点没有按值排序(您在问题中没有提到),所以这是不正确的。

您想要做的是:

  1. 在列表中找到最大的价值
  2. 删除具有该值的节点

T biggestValue = head.obj;

// 1
while(act != null) {
    if(act.obj.compareTo(biggestValue.obj) > 0) {
        biggestValue = act.obj;
    }
}

// 2
while(act != null) { // that loop and its body could be simplified by using: while(!act.obj.equals(biggestValue)) but I leave it that way for brevity
    if(act.obj.equals(biggestValue)) {
        prev.next = act.next;
        break;
    }
    prev = act;
    act = act.next;
}

答案 1 :(得分:0)

提示:如果单链列表包含多个项,并且您想剪切出包含最大值的节点,则必须使用两个while循环,第一个循环标识最大的值,即第二个循环以查找包含该最大值的节点并将其从列表中剪切。