如何合并2个链接列表

时间:2013-11-09 18:06:43

标签: java linked-list

我正在尝试为我的编程类中的家庭作业合并创建一个方法来合并两个链接列表。我真的很困惑,这个方法必须有这个方法签名:

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;
    }
}

我仍然无法理解链接列表的确切工作方式,因此非常感谢有关如何设计此方法的任何建议。

3 个答案:

答案 0 :(得分:1)

list1.merge2(list2)等方法调用中,该方法接收list1作为隐式“当前对象”,您可以使用this引用进行访问。

如果您愿意,可以使用其他名称:

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

答案 1 :(得分:0)

您的第一个列表将是this引用指向的实际对象。

答案 2 :(得分: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;
        }
    }
}