2013-10-17 54 views
-1

什么算法可以从链表中删除最小的元素,而不使用从链表类中的remove()。这是我必须找到最小的数据。我正在做一个Linkedlist类,所以我不想使用已经存在的方法来做到这一点。从链表中删除最小的元素

public void removeSmallest(){ 
    Node smallest=new Node(); 
    Node temp=head; 
    Node prev=null; 
    while(temp!=null){ 
     if(temp.next.data<temp.data && temp.next!=null){ 
      smallest.data=temp.next.data; 
     } 
    } 



} 

回答

1

你没有真正发布的问题是什么,但它可能看起来像你的代码是:

  1. if块之后不遍历列表,因为温度从不更新(temp = temp.next应帮帮我)。
  2. 根本没有使用prev的值。看起来你的链表实现不会产生节点的父节点,这是你需要的,这样你可以将父节点的next更新为最小节点之后的节点。
  3. 在您实际遍历该列表之后,您并未删除该元素。
+0

我的问题是如何从列表 – user2888979

+0

发现它@ user2888979后删除最小的元素:如果你看看我所提供的意见,并在代码中实现它们,那么你的方法应该工作。 – npinti

+0

由于这看起来像家庭作业,这是链接列表挑战的重要组成部分,因此如果没有您提供思考过程或尝试的证据,您将找不到可以为您回答的人。我的建议是绘制一个链接列表以及它之间的联系,想象如何在保持整个列表完整无缺的情况下删除一个项目。 – RankWeis

0

我在Java语法上有点生疏,但是扩展了你的代码,我认为它看起来像下面这样。

public void removeSmallest() { 
    Node smallest = head; 
    Node temp = head; 
    Node prev = null; 

    while(temp != null) { 
     if(temp.next != null && temp.next.data < smallest.data){ 
      smallest = temp.next; 
      prev = temp; 
     } 
     temp = temp.next; 
    } 

    prev.next = smallest.next; 
} 
+0

回想起来,如果列表中的第一个元素最小,则会忽略prev仍可为null。这可以通过在末尾进行显式检查来处理,或者将prev分配给新节点对象,并在超出作用域时将其删除。 – kjelderg

2
public void removeSmallest() { 
    Node smallest = head; 
    Node temp = head; 
    Node prev = null; 

    while(temp != null) { 
     if(temp.next != null && temp.next.data < smallest.data){ 
     smallest = temp.next; 
     prev = temp; 
     } 
    temp = temp.next; 
    } 

    if(smallest != head) { //First element is not min 
     prev.next = smallest.next; 
    } else { 
     head = head.next; //If first element is smallest, update the head 
    } 
}