2015-03-13 83 views
0

这是我用于实现单链表的完整Java源代码。我看过很多教程,他们一直在讨论如何在开始时插入节点。所以,我决定在我的代码中添加一个方法insertAfterNode(int y),我可以在特定节点之后的节点内添加数据。在链表中的特定节点之后插入

/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package datastructures; 

/** 
* 
* @author Administrator 
*/ 
public class Link { 

    int data; 

    Link next; 

    public Link(int d) { 

     this.data = d; 
    } 

    public void display() { 

     System.out.println(data); 
    } 


    public static class LinkedList { 

     Link first; 

     public void insertItemFirst(int x){ 

      Link newLink = new Link(x); 

      newLink.next = first; 
      first = newLink; 


     } 



     public Link deleteFirst() { 

      Link temp = first; 
      first = first.next; 
      return temp; 
     } 

     public void displayList() { 

      Link current = first; 

      while (current != null) { 

       current.display(); 
       current = current.next; 

      } 

     } 

     // START Of METHOD 


     public void insertAfterNode(int y) { 

      // Considering LinkedList is Sorted 
      Link newNode = new Link(y); 

      Link current = first; 

      while (current != null) { 

       while (current.data < y) { 

        current = current.next; 
        newNode.next = current; 
        current = newNode; 

       } 

      } 

     } 





     //END Of METHOD 

    } 



    public static void main(String[] args) { 

     LinkedList addelements = new LinkedList(); 

     addelements.insertItemFirst(20); 
     addelements.insertItemFirst(30); 
     addelements.insertItemFirst(40); 
     addelements.insertItemFirst(50); 
     addelements.insertAfterNode(44); 



     addelements.displayList(); 

     System.out.println("After Calling Deletion Method Once "); 

     addelements.deleteFirst(); 



     addelements.displayList(); 

    } 

} 

上面的代码继续在Netbeans中运行,我不得不停止构建退出它。我相信我的方法实现有问题。请让我知道我的以下方法有什么问题:

public void insertAfterNode(int y) { 

      // Considering LinkedList is Sorted 
      Link newNode = new Link(y); 

      Link current = first; 

      while (current != null) { 

       while (current.data < y) { 

        current = current.next; 
        newNode.next = current; 
        current = newNode; 

       } 

      } 

     } 

如果没有上述方法,代码就会正常运行。

+1

你的外部'while循环'永远不会终止。除了最后输入新节点之外,它不可能终止。你需要重新设计你的逻辑。 – 2015-03-13 09:19:59

+0

在高层把这个问题分为两部分。 1.找出所需的节点 2.将给予节点之后一个新的节点 阅读:[问题的理解节点的概念和链接列表(http://stackoverflow.com/questions/24895790/problems-understanding -concept-的节点和链接列表/ 24895863#24895863) – Braj 2015-03-13 10:47:21

回答

0

current仅当y的值大于current.data时链接引用才会更改。如果fist.data是10,并且y是5,那么您的代码将永远不会终止。

您必须修改while(current != null)周期。不要使用内部的while

Link newNode = new Link(y); 
// "first" requires a special treatment, as we need to replace the "first" value 
if(first.data > y){ 
    // insert the new Link as first element 
    newNode.next = first; 
    first = newNode; 
} else { 
    // we need the previous Link, because previous.next will be set to the newNode 
    Link previous = first; 
    Link current = first.next; 

    while (current != null) { 
     if(current.data < y) { 
      previous = current; 
      current = current.next; 
     } else { 
      // we insert newNode between previous and current 
      // btw. what should happen if current.data == y? 
      previous.next = newNode; 
      newNode.next = current; 
      break; // we are done, quit the cycle 
     } 
    } 
    // if the newNode.next is null at this point, means we have not inserted it yet. 
    // insert it as the last element in the list. previous is pointing at it. 
    if(newNode.next == null){ 
     previous.next = newNode; 
    } 
} // end of else 

P.S.我希望它的工作原理,我没有测试代码:)