查找偶数节点的双链表的中间位置

时间:2012-09-11 20:46:09

标签: java list

以下是我的代码,用于查找双链表的中间节点,但它仅适用于奇数个节点。我无法弄清楚如何处理偶数节点的情况:

public Object findMiddleNode() {
    DLNode first = getHeadNode();
    DLNode last = getTailNode();
    while(first!=last) {
        first = first.getNext();
        last = last.getPrevious();
    }
    return first.getElement();      
}

这是我更新的代码:

public MyDequeue findMiddleNode() {
    DLNode first = getHeadNode();
    DLNode last = getTailNode();
    MyDequeue m = new MyDequeue();
    while(first!=last && first.getNext()!= last) {
        first = first.getNext();
        last = last.getPrevious();
    }
    if(first == last) {
        m.insertLast(first.getElement());           
        return m;
    }           
    else {
        m.insertLast(first.getElement());
        m.insertLast(last.getElement());
        return m;
    }
}

MyDequeue类是我对双向链表的实现。我返回MyDequeue的原因是因为我已经有了一个打印双向链表的元素的静态打印方法。

3 个答案:

答案 0 :(得分:2)

对于偶数个节点,第一个和最后一个在中间相互传递。例如,如果你有4个节点1..4,当last是3时,第一个节点将是2.在下一个迭代中,第一个将是3,最后一个将是2.所以你永远不会失败while循环测试(首先!=最后)需要在适当的点退出循环。一个简单的解决方法是将您的while测试修改为

while ((first != last) && (first.getNext() != last)) {

答案 1 :(得分:1)

This is my code in java 
import java.util.LinkedList;

public class DeleteMiddleLinkedList {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<String>();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");

        DeleteMiddleLinkedList ds = new DeleteMiddleLinkedList();
        ds.middleDelete(list, "");

        for (String s : list) {
            System.out.println(s);
        }

    }

    public void middleDelete(LinkedList<String> list, String s) {
        int size = list.size();

        if (list == null) {
            return;
        }

        if (size % 2 == 0) {
            list.remove(size / 2);
            list.remove((size / 2) - 1);
        } else if (size % 2 != 0) {
            list.remove((size / 2));
        }

    }

}

答案 2 :(得分:0)

这是我更新的代码:

public MyDequeue findMiddleNode() 
{
    DLNode first = getHeadNode();
    DLNode last = getTailNode();
    MyDequeue m = new MyDequeue();
    while(first!=last && first.getNext()!= last) 
    {
        first = first.getNext();
        last = last.getPrevious();
    }
    if(first == last) 
    {
        m.insertLast(first.getElement());           
        return m;
    }           
    else 
    {
        m.insertLast(first.getElement());
        m.insertLast(last.getElement());
        return m;
    }
}

MyDequeue类是我对双向链表的实现。我返回MyDequeue的原因是bcuz我已经有一个静态打印方法打印双链表的元素。对于更好的解决方案的任何建议?