10

我想保持列表中添加的元素的顺序。所以,我LinkedList在Java中使用了a。

现在我希望能够交换链表中的两个元素。首先,我找不到elementAt()for LinkedList。此外,无法在指定位置添加元素。

4

7 回答 7

25

您可以使用aCollections.swap(List<?> list, int i, int j)来交换 a 的两个元素List<?>。还有LinkedList.get(int index)LinkedList.add(int index, E element)(都是由 指定的方法interface List)。所有这些操作都会O(N)因为 aLinkedList没有implements RandomAccess

于 2010-05-15T08:25:11.350 回答
2

查看LinkedList的 Javadocs

index使用中查找元素get(int index)

用于element特定index用途set(int index, Object element)

于 2010-05-15T08:29:05.290 回答
2

如果您正在编写自己的 LinkedList 类以进行练习(即用于项目或学校),请尝试创建两个临时 Object 变量和两个 int 来保持它们在 List 中的位置。然后,使用 add(int, Object) 将第一个添加到第二个位置,第二个添加到第一个位置。

于 2012-12-05T13:08:42.353 回答
1
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;
    }
}

}

于 2016-12-02T10:42:26.410 回答
0

添加

这是你想要的吗?

如果要保持列表处于排序状态,为什么不使用addfirst插入元素

然后使用Collections.sort对列表进行排序

于 2010-05-15T08:28:07.497 回答
0

看看ArrayList,这个类既会维护插入顺序,又会提供 O(1) 随机访问。

于 2010-05-15T08:38:11.630 回答
0
 // I tried to reduce time complexity here, in 3 while loops (get() and set() use 4 while loop)
   void swapAt(int index1, int index2){ // swapping at index
        Node tmp = head;
        int count=0;
        int min, max;   // for future reference to reduce time complexity
        if(index1<index2){
             min = index1;
             max = index2;
        }
        else{
             min = index2;
             max = index1;
        }    
        int diff = max - min;
        while(min!=count){
            tmp=  tmp.next;
            count++;
        }
        int minValue = tmp.data; 
        while(max!=count){
            tmp=  tmp.next;
            count++;
        }
        int maxValue = tmp.data;
        tmp.data = minValue;
        tmp = head;
        count =0;
        while(min!=count){
            tmp=  tmp.next;
            count++;
        }
        tmp.data = maxValue;
    }
于 2020-11-06T13:31:50.227 回答