Поменяйте местами элементы в LinkedList - PullRequest
8 голосов
/ 15 мая 2010

Я хочу сохранить порядок элементов, добавляемых в список. Итак, я использовал LinkedList в Java.

Теперь я хочу поменять местами два элемента в связанном списке. Прежде всего, я не могу найти elementAt() для LinkedList. Кроме того, нет возможности добавить элемент в указанной позиции.

Ответы [ 6 ]

23 голосов
/ 15 мая 2010

Существует Collections.swap(List<?> list, int i, int j), который можно использовать для замены двух элементов List<?>. Также есть LinkedList.get(int index) и LinkedList.add(int index, E element) (оба метода определены interface List). Все эти операции будут O(N), поскольку LinkedList не implements RandomAccess.

2 голосов
/ 05 декабря 2012

Если вы пишете свой собственный класс LinkedList для упражнений (то есть для проекта или школы), попробуйте создать две временные переменные объекта и два целых числа, чтобы сохранить их позицию в списке. Затем используйте add (int, Object), чтобы добавить первое во 2-й позиции, второе в 1-й позиции.

2 голосов
/ 15 мая 2010

Проверьте Javadocs для LinkedList

Чтобы найти элемент в index, используйте get(int index)

Чтобы разместить element на определенном index, используйте set(int index, Object element)

0 голосов
/ 02 декабря 2016
public class SwapNode {

public static Node head;

public static void main(String[] args) {
    SwapNode obj = new SwapNode();
    obj.insertAtEnd(5);
    obj.insertAtEnd(6);
    obj.insertAtEnd(4);
    obj.insertAtEnd(7);
    obj.insertAtEnd(3);
    obj.insertAtEnd(8);
    obj.insertAtEnd(2);
    obj.insertAtEnd(9);
    obj.insertAtEnd(1);
    obj.print(head);
    System.out.println("*** Swapped ***");
    obj.swapElementValue(4, 2);     
}

public void swapElementValue(int value1, int value2) {
    if (value1 == value2) {
        System.out.println("Values same, so no need to swap");
        return;
    }
    boolean found1 = false, found2 = false; 
    Node node = head;
    while (node != null && !(found1 && found2)) {
        if (node.data == value1) {
            node.data = value2;
            found1 = true;
            node = node.next;
            continue;
        }
        if (node.data == value2) {
            node.data = value1;
            found2 = true;
            node = node.next;
            continue;
        }
        node = node.next;
    }
    if (found1 && found2) {
        print(head);
    } else {
        System.out.println("Values not found");
    }
}

public void insertAtEnd(int data) {
    Node newNode = new Node(data);
    if (head == null) {
        head = newNode;
        return;
    }

    Node temp = head;
    while (temp.next != null) {
        temp = temp.next;
    }
    temp.next = newNode;
}

public void print(Node head) {
    Node temp = head;
    while(temp != null) {
        System.out.print(temp.data);
        temp = temp.next;
    }
    System.out.println();
}


static class Node {
    private int data;
    public Node next;

    public Node(int data) {
        this.data = data;
    }
}

}

0 голосов
/ 15 мая 2010

Посмотрите на ArrayList , этот класс будет поддерживать порядок вставки и обеспечивать O (1) произвольный доступ.

0 голосов
/ 15 мая 2010

добавить

Это то, что вы хотите?

Если вы хотите сохранить список в отсортированном состоянии, почему бы просто не вставить элемент с помощью addfirst

и затем сортируйте список, используя Collections.sort

...