2013-11-09 55 views
0

我想在我的编程类中做一个方法来合并两个链接的列表作业作业。我真的很困惑,方法必须有这种方法签名:如何合并2个链表

public UnorderedLinkedListInt merge2(UnorderedLinkedListInt list),所以在我的测试方法,它会看起来像这样list3 = list1.merge2(list2)。我很困惑如何做到这一点,当方法只在一个列表中,而不是两个。这是到目前为止我的代码

public class UnorderedLinkedListInt extends LinkedListIntClass { 
    //Default constructor 
    public UnorderedLinkedListInt() { 
     super(); 
    } 

    public boolean search(int searchItem) { 
     LinkedListNode current; //variable to traverse the list 
     current = first; 
     while (current != null) 
      if (current.info == searchItem) 
       return true; 
      else 
       current = current.link; 
     return false; 
    } 

    public void insertFirst(int newItem) { 
     LinkedListNode newNode; //variable to create the new node 
     //create and insert newNode before first 
     newNode = new LinkedListNode(newItem, first); 
     first = newNode; 
     if (last == null) 
      last = newNode; 
     count++; 
    } 

    public void insertLast(int newItem) { 
     LinkedListNode newNode; //variable to create the new node 
     //create newNode 
     newNode = new LinkedListNode(newItem, null); 
     if (first == null) { 
      first = newNode; 
      last = newNode; 
     } 
     else { 
      last.link = newNode; 
      last = newNode; 

     } 
     count++; 
    } 

    public void deleteNode(int deleteItem) { 
     LinkedListNode current; //variable to traverse the list 
     LinkedListNode trailCurrent; //variable just before current 
     boolean found; 
     //Case 1; the list is empty 
     if (first == null) 
      System.err.println("Cannot delete from an empty list."); 
     else { 
      //Case 2: the node to be deleted is first 
      if (first.info == deleteItem) { 
       first = first.link; 
       if (first == null) //the list had only one node 
        last = null; 
       count--; 
      } 
      else { //search the list for the given info 
       found = false; 
       trailCurrent = first; //trailCurrent points to first node 
       current = first.link; //current points to second node 
       while (current != null && !found) { 
        if (current.info == deleteItem) 
         found = true; 
        else { 
         trailCurrent = current; 
         current = current.link; 
        } 
       } 
       //Case 3; if found, delete the node 
       if (found) { 
        count--; 
        trailCurrent.link = current.link; 
        if (last == current) //node to be deleted was the last node 
         last = trailCurrent; 
       } 
       else 
        System.out.println("Item to be deleted is not in the list."); 
      } 
     } 
    } 
    public void merge(UnorderedLinkedListInt list2){ 
     UnorderedLinkedListInt list1 = this; 

     while (list2.first != null) {//while more data to print 
      list1.insertLast(list2.first.info); 
      list2.first = list2.first.link; 
     } 
    } 
    public UnorderedLinkedListInt merge2(UnorderedLinkedListInt list2){ 
     UnorderedLinkedListInt list3 = new UnorderedLinkedListInt(); 
     UnorderedLinkedListInt list1 = this; 
     while (list1.first != null) {//while more data to print 
      list3.insertLast(list1.first.info); 
      list1.first = list1.first.link; 
     } 
     while (list2.first != null) {//while more data to print 
      list3.insertLast(list2.first.info); 
      list2.first = list2.first.link; 
     } 
     return list3; 
    } 
} 

我仍然有一些麻烦,正是理解链表是如何工作的,任何建议,如何设计这种方法将不胜感激。

回答

1

在像list1.merge2(list2)一个方法调用,该方法接收list1作为隐含的“当前对象”可以与this参考访问。

如果你愿意,你可以用它的另一个名字:

public UnorderedLinkedListInt merge2(UnorderedLinkedListInt list2){ 
    UnorderedLinkedListInt list1 = this; 
    // now merge list1 and list2 
} 
+0

使用你的建议,它工作得很好,谢谢!但即时通讯我的merge2方法,当我运行它的问题。它只将list1添加到list3我不确定为什么它不添加list2? –

+0

您的代码会修改传递给它的列表。那是故意的吗? – Joni

+0

没有我的目标是list2保持不变,只有list1才能更改。 –

0

你的第一个清单将是实际的对象由this参考指向。

0
import java.io.*; 
class Node1 
{ 
    int data; 
    Node1 link; 

    public Node1() 
    { 
     data=0; 
     link=null; 
     } 

    Node1 ptr,start,temp,ptr1; 

    void create()throws IOException 
    { 
     int n; 
     BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 
     System.out.println("Enter first data"); 
     this.data=Integer.parseInt(br.readLine()); 
     ptr=this; 
     start=ptr; 
     char ins ='y'; 
     do 
     { 
      System.out.println("Wanna Insert another node???"); 
      ins=(char)br.read(); 
      br.read(); 
      if(ins=='y') 
      { 
       temp=new Node1(); 
       System.out.println("Enter next data"); 
       temp.data=Integer.parseInt(br.readLine()); 
       temp.link=null; 
       ptr.link=temp; 
       temp=null; 
       ptr=ptr.link; 
       } 
      }while(ins=='y'); 
     } 

    void merge()throws IOException 
    { 
     ptr1=this; 
     ptr=this; 
     Node1 t=new Node1(); 
     t.create(); 
     while(ptr1.link!=null) 
     { ptr1=ptr1.link;} 
     ptr1.link=t.start; 
     ptr1=t=null; 
     System.out.println("---------------------------"); 
     System.out.println("Merged LL :\n"); 
     while(ptr!=null) 
     { 
      System.out.print("-->"+ptr.data); 
      ptr=ptr.link; 
     } 
    } 
}