Связанные операции список для конкурса


После проверки некоторые входящие соревнованиях кодирования, я чувствую, я хочу, чтобы разработать немного больше на мои навыки кодирования и стиль, используя некоторые основные алгоритмы/структуры данных.

Следующие два куска кода Java, о каких LinkedList не операция. Вы можете взять быстрый взгляд и дать мне некоторую обратную связь о точности, эффективности, лучшее решение или стиль кода?

Код Java включает в себя некоторые простые комментарии, тест-кейсов, и это проверено на Java 6 и рассмотрел себя.

/*
* purpose of program - for a singly linkedList, switch the elements at odd number positions with
* the ones at even number positions
*
input sample : 1>2>3>4>5; expecting output: 2>1>4>3>5;
input sample : 1>2>3>4; expecting output: 2>1>4>3;

*/

ListTwister.java

package com.algo;


/*
 * purpose of program - for a singly linkedList, switch the elements at odd number positions with 
 * the ones at even number positions 
 * 
input sample : 1>2>3>4>5; expecting output: 2>1>4>3>5;
input sample : 1>2>3>4;   expecting output: 2>1>4>3;

 */

public class ListTwister {

    /* for odd sequence element (array index = 0, 2, etc), store a "branch head", store prev node, and move to next;
    for even sequence element (array index = 1, 3, etc), store the "nextNode", twist current and prev node, link the "branch head" to the currentNode, and link the "prev node" to cached "nextNode"
     */
    public static Node twist(Node head) {
        Node current = head, newHead = null, branchHead = null, tempNext = null, prev = null ;
        int index = 0;

        if (head!=null & head.next!=null ) {
            newHead = head.next;
        }
        else {
            newHead = head;
        }

        while (current != null) {
            //odd sequence 
            if (index % 2 == 0) {
                branchHead  = prev;
                prev = current;
                current = current.next;
            }           
            //even sequence 
            else {
                tempNext = current.next;
                current.next = prev;
                if (branchHead != null ) {
                    branchHead.next = current;
                }
                prev.next = tempNext;
                current = tempNext;             
            }

            index ++;
        } // end of while

        return newHead;

    } // end of twist()

    public static void main (String args[]) {
        Node head_list1 = new Node(1, null);
        Node node2_list1 = new Node(2, null);
        Node node3_list1 = new Node(3, null);
        Node node4_list1 = new Node(4, null);
        Node node5_list1 = new Node(5, null);

        head_list1.add(node2_list1 );
        node2_list1.add(node3_list1 );
        node3_list1.add(node4_list1 );
        node4_list1.add(node5_list1 );

        Node head_list2 = new Node(1, null);
        Node node2_list2 = new Node(2, null);
        Node node3_list2 = new Node(3, null);
        Node node4_list2 = new Node(4, null);

        head_list2.add(node2_list2 );
        node2_list2.add(node3_list2 );
        node3_list2.add(node4_list2 );

        head_list1.print();
        //expect to output : 2->1->4->3->5->END.        
        twist(head_list1).print();

        head_list2.print();
        //expect to output : 2->1->4->3->END.       
        twist(head_list2).print();      

    } // end of main()

} // end of class

Node.java

package com.algo;

/*
Node for singly LinkedList;
 */

public class Node {
    public int value;
    public Node next;

    public Node (int value, Node next) {
        this.value = value;
        this.next = next;
    }

    public void add(Node node) {
        this.next = node;
    }

    public void print() {
        Node current = this;
        while (current!=null ) {
            System.out.print(current.value + "->");
            current = current.next;
        }
        if (current==null) {
            System.out.println("END.");
        } 
    }
} // end of class


626
2
задан 26 ноября 2011 в 02:11 Источник Поделиться
Комментарии
1 ответ

Переименование Узла.добавить к setNext, так как его сеттер метод:

public void setNext(final Node node) {
this.next = node;
}


Создать конструктор с единственным значением параметра:

public Node(final int value) {
this.value = value;
}

и называть это основной способ, вместо того чтобы передать значение nullс:

final Node head_list1 = new Node(1);


Не используйте общественные поля:

public int value;
public Node next;

Сделать их частная и обеспечить геттеры и сеттеры.


В значении поля может быть окончательной:

public class Node {
private final int value;
...
}

Она не должна меняться, поэтому защитить ее окончательной.


Вместо основной способ писать самопроверки блок тесты. Разнесенной главной должны быть разделены на два теста.


На узле класса не должен нести ответственность за печати. Она должна возвращать строку , а не система.из.печать() звонки. Может быть, другой клиент хочет записать его в файл или сокет, но система.из.печать() сделали это невозможным.


Объявить только одной переменной в каждой строке.


    while (current != null) {
System.out.print(current.value + "->");
current = current.next;
}
if (current == null) {
System.out.println("END.");
}

О текущая == нулевое состояние, кажется, всегда верно, так это лишнее:

    while (current != null) {
System.out.print(current.value + "->");
current = current.next;
}
System.out.println("END.");


Регистрация вход:

public static Node twist(final Node head) {
if (head == null) {
throw new NullPointerException("head cannot be null");
}
...
}


Это ненужный, чтобы установить значение по умолчанию для всех переменных на значение null:

Node newHead = null;

Кроме того, это может быть окончательной , поскольку он вам его значение, прежде чем оно будет использовано:

final Node newHead;


Читать эффективная Java, второе издание, пункт 45: минимизировать область видимости локальных переменных. (Google для "минимизации видимости локальных переменных", это в Google книгах тоже.)

Например, tempNext должна быть объявлена внутри другой ветке:

else {
final Node tempNext = current.next;
current.next = prev;
if (branchHead != null) {
branchHead.next = current;
}
prev.next = tempNext;
current = tempNext;
}


Использование верблюжьего имена переменных: head_list1 -> headList1. (Эффективная Java, второе издание, пункт 56: придерживаться общепринятых правил именования)

1
ответ дан 26 ноября 2011 в 08:11 Источник Поделиться