【问题标题】:Delete node with biggest values from linked list从链表中删除具有最大值的节点
【发布时间】:2018-10-11 20:34:18
【问题描述】:

我想从我的线性链表中删除具有最大通用 T 对象的节点(列表只有头)并返回这个节点的对象。方法签名必须和我目前得到的代码类似:

列表如下所示:

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循环来删除节点。如果我找到最大的元素,prev.next 指针必须以某种方式指向 act.next 节点。

【问题讨论】:

  • 如果您希望人们阅读代码,请考虑正确缩进代码。
  • 也许您应该发布可编译的代码...

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


【解决方案1】:

您的代码当前所做的是比较两个相邻节点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;
}

【讨论】:

  • 非常感谢!
【解决方案2】:

提示:如果单链表包含多于一项,并且要切出包含最大值的节点,则必须使用两个while循环,第一个循环识别最大值是什么,第二个循环找到包含该最大值的节点并将其从列表中删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 2021-12-16
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多