2015-04-04 92 views
1

我在java.Now中设计了我自己的单链表数据结构,我将要定义一个具有特定行为的函数。我将这个函数命名为“PurgeList”。该函数应该删除每个重复的节点相同的内容),并且至少我希望列表本身只保留一个包含该内容的节点。例如,如果节点中保存的当前内容是顺序的:如何从链表中删除重复的节点?

1,2,3 ,4,1,4,5

与所提到的行为的函数执行后,该列表必须塑造成:

1,2,3,4,5

例代码:

1-类节点

public class Node { 
Object Element; 
Node Link; 

public Node() { 
    this(null,null); 
} 

public Node(Object Element, Node Link) { 
    this.Element = Element; 
    this.Link = Link; 
} 
} 

2-班级列表

import java.util.Scanner; 
public class List { 
int Size; 
Node FirstNode; 
Scanner UserInfo = new Scanner(System.in); 
Scanner UserInput = new Scanner(System.in); 
Node LastNode; 
public List() { 
    FirstNode = null; 
    Size = 1; 
} 
public void PurgeList() { 
    Node temp1 = FirstNode; 
    while (temp1 != null) { 
     Node temp2 = temp1; 
     while (temp2.Link != null) 
      if (temp1.Element.equals(temp2.Link.Element)) 
       temp2 = temp2.Link; 
      else 
       temp2=temp2.Link; 
     temp1=temp1.Link; 
    } 
} 
public boolean IsEmpty() { 
    return FirstNode == null; 
} 
public int SizeOf() { 
    return Size; 
} 
public void InsertArbitrary() { 
    System.out.print("Where To Put Node : "); 
    int Location = UserInput.nextInt(); 
    if (Location > Size) { 
     System.out.println("Invalid Input.Try again"); 
     return; 
    } else if (Location < 0) { 
     System.out.println("Invalid Input.Try again"); 
     return; 
    } else if (Location == 1) { 
     System.out 
       .printf("Enter something to save in Node %d : ", Location); 
     Object Element = UserInfo.nextLine(); 
     FirstNode = new Node(Element, FirstNode); 
    } else if (Location > 0 && Location <= Size) { 
     System.out 
       .printf("Enter something to save in Node %d : ", Location); 
     Object Element = UserInfo.nextLine(); 
     Node CurrentNode = FirstNode; 
     for (int i = 1; i <= Location - 2; i++) { 
      CurrentNode = CurrentNode.Link; 
     } 
     Node NewNode = new Node(Element, CurrentNode.Link); 
     CurrentNode.Link = NewNode; 
    } else { 
     System.out.println("Invalid Number . Try again."); 
     return; 
    } 
    Size++; 
} 

public void ShowOff() { 
    Node Temp; 
    Temp = FirstNode; 
    int number = 1; 

    while (Temp != null) { 
     System.out.println(Temp.Element); 
     Temp = Temp.Link; 
     number++; 
    } 
} 
protected boolean ListIsEmpty() { 
    return FirstNode == null; 
} 
} 

我复制了我执行其他函数的更多细节。我也追踪了我的程序,但没有发现我的逻辑错误。请帮我解决这个问题。提前感谢。

+0

请注意,链接列表本质上是越野车,即使是有经验的程序员。许多仔细的测试和调试是必需的。 – 2015-04-04 21:45:51

回答

1

当您找到重复项时,您不会删除该节点。

而不是

while (temp2.Link != null) 
     if (temp1.Element.equals(temp2.Link.Element)) 
      temp2 = temp2.Link; 
     else 
      temp2=temp2.Link; 

尝试

 while (temp2.Link != null) { 
      if (temp1.Element.equals(temp2.Link.Element)) 
       temp2.Link = temp2.Link.Link; 
      else 
       temp2=temp2.Link; 
     } 

你应该尽量想不同的情况,以测试它做好。我试着用这个:

public static void main(String[] args) { 
    List list = new List(); 
    for (int i=0; i<5; ++i) { 
     list.InsertArbitrary(); 
    } 
    list.ShowOff(); 
    list.PurgeList(); 
    System.out.println("------------------"); 
    list.ShowOff(); 
} 

$ java List 
Where To Put Node : 1 
Enter something to save in Node 1 : 1 
Where To Put Node : 2 
Enter something to save in Node 2 : 2 
Where To Put Node : 3 
Enter something to save in Node 3 : 3 
Where To Put Node : 4 
Enter something to save in Node 4 : 1 
Where To Put Node : 5 
Enter something to save in Node 5 : 5 
1 
2 
3 
1 
5 
------------------ 
1 
2 
3 
5 

$ java List 
Where To Put Node : 1 
Enter something to save in Node 1 : 1 
Where To Put Node : 2 
Enter something to save in Node 2 : 1 
Where To Put Node : 3 
Enter something to save in Node 3 : 1 
Where To Put Node : 4 
Enter something to save in Node 4 : 1 
Where To Put Node : 5 
Enter something to save in Node 5 : 1 
1 
1 
1 
1 
1 
------------------ 
1 
+0

谢谢你jas。两个问题,为什么人们没有投票我的问题?在提问时我的错误是什么? – Erfan 2015-04-04 17:16:19

+1

哦,很难进入StackOverflow用户的思维。我几乎可以说,在没有得票的情况下问一个问题是一个成就,更不用说得票了。你的问题绝对是好的,它的格式很好,你用一个具体的例子清楚地说明你要完成什么,并且给出了重现错误所需的所有代码。唯一的批评可能是它有点“我的代码不起作用,这是我的代码,它有什么问题?”这是一个问题,而不是其他人可以从中学习的更普遍的问题。 – jas 2015-04-04 19:41:16

+0

你是一个令人印象深刻的人。我编辑了我的问题。再次感谢你。你能给我发一封电子邮件吗?我真的有动力与你保持联系。 [email protected] – Erfan 2015-04-04 20:45:07

0

你需要使用Set Collection来避免重复的值。 这里是一个例子The Set interface