将链表附加到另一个链表

时间:2016-02-12 22:17:06

标签: java linked-list

我是CS专业的第一年,我想知道你是否可以帮我清理我的MyStringBuilder类中的append(StringBuilder b)方法。我在最后一次尝试在我的测试驱动程序中链接列表之间来回追踪问题。我在这之前的每一步插入调试打印语句,它似乎工作正常......每个字符串构建器对象应该仍然存在彼此独立。谢谢!

//SAMPLE OUTPUT (what its supposed to be)  
**Testing constructor methods  
this is a string  
 another string   

Testing Append methods  
this is a string another string  
this is a string another string and another  
this is a string another string and another another string  
this is a string another string and another another string!!  
 another string different strings?  
...appending data**  

//MY CURRENT OUTPUT  
**Testing constructor methods  
this is a string  
 another string  


Testing Append methods  
this is a string another string  
this is a string another string and another  
this is a string another string and another another string  
this is a string another string different strings?  
 another string different strings?  
...appending data**  

MY STRING BUILDER CLASS THUS FAR

public class MyStringBuilder
{
     private CNode firstC; //first  character node
     private CNode lastC; //last character node
     private int length; //length of mystringbuilder object

public MyStringBuilder(String s) //this one should is correct since it was given!
    {
        if (s == null || s.length() == 0) // Special case for empty String
        {                                 // or null reference
            firstC = null;
            lastC = null;
            length = 0;
        }
        else
        {
            // Create front node to get started
            firstC = new CNode(s.charAt(0));
            length = 1;
            CNode currNode = firstC;
            // Create remaining nodes, copying from String.  Note
            // how each new node is simply added to the end of the
            // previous one.  Trace this to see what is going on.
            for (int i = 1; i < s.length(); i++)
            {
                CNode newNode = new CNode(s.charAt(i));
                currNode.next = newNode;
                currNode = newNode;
                length++;
            }
            lastC = currNode;
        }
    }

    // Create a new MyStringBuilder initialized with the chars in array s
    public MyStringBuilder(char [] s)
    {
        if (s == null || s.length == 0) // Special case for empty char array
        {                                 // or null reference
            firstC = null;
            lastC = null;
            length = 0;
        }
        else
        {
            // Create front node to get started
            firstC = new CNode(s[0]);
            length = 1;
            CNode currNode = firstC;
            // Create remaining nodes, copying from char array.
            for (int i = 1; i < s.length; i++)
            {
                CNode newNode = new CNode(s[i]);
                currNode.next = newNode;
                currNode = newNode;
                length++;
            }
            lastC = currNode;
        }
    }


    // Create a new empty MyStringBuilder
    public MyStringBuilder()
    {
        firstC=null;
        lastC=null;
        length=0;
    }


    // Append MyStringBuilder b to the end of the current MyStringBuilder, and
    // return the current MyStringBuilder.  Be careful for special cases!
    public MyStringBuilder append(MyStringBuilder b)
    {
        if(length==0)
        {
            firstC = new CNode(b.firstC.data);
            length = 1;
            CNode currNode = b.firstC;
            for (int i = 1; i < b.length; i++)
            {
                CNode newNode = new CNode(currNode.next.data);
                currNode.next = newNode;
                currNode = newNode;
                length++;
            }
            lastC = currNode;

        }
        else{//works
            CNode currNode = lastC;

            CNode newNode = b.firstC;
            for (int i = 1; i < b.length+1; i++)
            {
                currNode.next = newNode;

                currNode = newNode;

                newNode = currNode.next;

                length++;
            }
            lastC = currNode;
        }
        return b;
    }

    // Append String s to the end of the current MyStringBuilder, and return
    // the current MyStringBuilder.  Be careful for special cases!
    public MyStringBuilder append(String s)
    {
        if (s == null ) // Special case for null ref
        {
            throw new NullPointerException("attempting to add empty string");
        }
        else // non null ref
        {
            //convert string argument to temp char array to be passed into nodes
            char [] tempCArray = s.toCharArray();
            if (isEmpty()) // if stringbuilder is empty
            {
                // Create front node to get started
                firstC = new CNode(tempCArray[0]);
                length = 1;
                CNode currNode = firstC;

                // Create remaining nodes, copying from temp char array.
                for (int i = 1; i < tempCArray.length; i++)
                {
                    CNode newNode = new CNode(tempCArray[i]);
                    currNode.next = newNode;
                    currNode = newNode;
                    length++;
                    lastC = currNode;
                }
            }
            //is stringbuilder is not empty
            else {
                CNode currNode = lastC;
                //if string builder is not empty
                // Create  nodes, copying from temp char array.
                for (int i = 0; i < tempCArray.length; i++) {
                    CNode newNode = new CNode(tempCArray[i]);
                    currNode.next = newNode;
                    currNode = newNode;
                    length++;
                    lastC = currNode;
                }

            }

        }
        return this;

    }

    // Append char array c to the end of the current MyStringBuilder, and
    // return the current MyStringBuilder.  Be careful for special cases!
    public MyStringBuilder append(char [] c)
    {
        if (c == null || c.length == 0) // Special case for empty char array
        {                                 // or null reference
            throw new NullPointerException("attempting to add empty character array");
        }
        else
        {

            if (isEmpty()) // if stringbuilder is empty
            {
                // Create front node to get started
                firstC = new CNode(c[0]);
                length = 1;
                CNode currNode = firstC;

                // Create remaining nodes, copying from char array.
                for (int i = 1; i < c.length; i++)
                {
                    CNode newNode = new CNode(c[i]);
                    currNode.next = newNode;
                    currNode = newNode;
                    length++;
                    lastC = currNode;
                }
            }
            //is stringbuilder is not empty
            else {
                CNode currNode = lastC;
                //if string builder is not empty
                // Create  nodes, copying from char array.
                for (int i = 0; i < c.length; i++) {
                    CNode newNode = new CNode(c[i]);
                    currNode.next = newNode;
                    currNode = newNode;
                    length++;
                    lastC = currNode;
                }

            }

        }
        return this;
    }

    // Append char c to the end of the current MyStringBuilder, and
    // return the current MyStringBuilder.  Be careful for special cases!
    public MyStringBuilder append(char c)
    {
        CNode newNode = new CNode(c);
        if (isEmpty())
        {
            firstC = newNode;
            lastC = newNode;
        }   //if stringbuilder object is empty
        else
        {
            CNode currNode = lastC;
            currNode.next=newNode;
            currNode = newNode;
            lastC = currNode;
        }   // if stringbuilder object is not empty
        length++;
        return this;
    }
public String toString() //!!must change to eliminate +!!
    {
        CNode currNode= firstC;
        char [] temp = new char [length];
        int counter=0;
        if (length == 0)
            return "";
        while (currNode.next !=null)
        {
            temp[counter]=currNode.data;
            currNode = currNode.next;
            counter++;
        }
        temp[counter]=currNode.data;
        String result = new String (temp);
        return result;
    }


    /** additional private methods **/
    private boolean isEmpty()
    {
        if (length<1)
            return true;
        return false;

    }   //end of isEmpty

private class CNode
    {
        private char data;
        private CNode next;

        public CNode(char c)
        {
            data = c;
            next = null;
        }

        public CNode(char c, CNode n)
        {
            data = c;
            next = n;
        }
    } // end of CNode inner class
} //end of MyStringBuilder class

测试驾驶员计划ASSIG2AltTest

public class Assig2AltTest
{
    public static void main(String [] args)
    {
        System.out.println("Testing constructor methods");
        MyStringBuilder b1 = new MyStringBuilder("this is a string");
        char [] c = {' ','a','n','o','t','h','e','r',' ','s','t','r','i','n','g'};
        MyStringBuilder b2 = new MyStringBuilder(c);
        MyStringBuilder b3 = new MyStringBuilder();

        System.out.println(b1);
        System.out.println(b2);
        System.out.println(b3);  // will show as an empty line

        System.out.println("\nTesting Append methods");
        b1.append(b2);
        System.out.println(b1);
        b1.append(" and another");
        System.out.println(b1);
        b1.append(c);
        System.out.println(b1);
        b1.append('!');  b1.append('!');  // char append
        b2.append(" different strings?");
        System.out.println(b1); // Testing for independence of the StringBuilders
        System.out.println(b2); // after append.  b1 should be unchanged here
        // Special case appending to empty object
        b3.append("...appending data");
        System.out.println(b3);
     }
}

1 个答案:

答案 0 :(得分:0)

问题在于你的

public MyStringBuilder append(MyStringBuilder b)
课程MyStringBuilder

中的

方法

else块错误

} else {// works
    CNode currNode = lastC;

    CNode newNode = b.firstC;
    for (int i = 1; i < b.length + 1; i++) {
        currNode.next = newNode;

        currNode = newNode;

        newNode = currNode.next;

        length++;
    }
    lastC = currNode;
}

此代码执行以下操作 - 此处的节点现在指向b中的节点。这意味着当您在测试b2中追加Assig2AltTest时,您实际上也会修改b1,因为b1已开始指向b2中的节点}。

您应该像这样编辑append(MyStringBuilder b)方法:

public MyStringBuilder append(MyStringBuilder b) {
        if (length == 0) {
            firstC = new CNode(b.firstC.data);
            length = 1;
            CNode currNode = b.firstC;
            for (int i = 1; i < b.length; i++) {
                CNode newNode = new CNode(currNode.next.data);
                currNode.next = newNode;
                currNode = newNode;
                length++;
            }
            lastC = currNode;

        } else {// works
            CNode currNode = lastC;

            CNode bNode = b.firstC;
            for (int i = 1; i < b.length + 1; i++) {

                CNode newNode = new CNode(bNode.data);
                currNode.next = newNode;

                currNode = newNode;

                newNode = currNode.next;
                bNode = bNode.next;
                length++;
            }
            lastC = currNode;
        }
        return b;
    }