2009-08-17 23 views
5

Tôi cần lặp lại thông qua LinkedList<T> (trong .NET 2.0) và xóa tất cả các mục theo một tiêu chí nhất định. Đó là cách dễ dàng dưới Java, kể từ khi tôi có thể làm như sau:LinkedList <T> (2.0): xóa các mục lặp lại

Iterator<E> i = list.iterator(); 
while (i.hasNext()) { 
    E e = i.next(); 
    if (e == x) { 
     // Found, so move it to the front, 
     i.remove(); 
     list.addFirst(x); 
     // Return it 
     return x; 
    } 
} 

Thật không may, trong hành vi NET của IEnumerator<T> (tương đương với Iterator<E>) không có remove phương pháp để loại bỏ các yếu tố hiện tại từ bộ sưu tập. Ngoài ra, trong các LinkedList<T> không có cách nào để truy cập vào một phần tử tại một chỉ mục nhất định, để hoàn thành nhiệm vụ bằng cách lặp lại từ phần tử cuối cùng đến đầu tiên.

Bạn có ý tưởng nào về cách thực hiện không? Cảm ơn nhiều!

+3

Tại sao là này một wiki cộng đồng? Nó không phải là một điều chủ quan - có một câu trả lời rõ ràng ở đây. –

Trả lời

11

này sẽ loại bỏ tất cả các nút phù hợp với một tiêu chí, trong một vòng lặp thông qua danh sách được liên kết.

LinkedListNode<E> node = list.First; 

while (node != null) 
{ 
    var next = node.Next; 
    if (node.Value == x) { 
     list.Remove(e); 
    } 
    node = next; 
} 

Tôi tin rằng đó là những gì bạn đang cố gắng ... Bạn cũng có thêm lại trong nút vào đầu danh sách (do đó, mã java của bạn không loại bỏ tất cả các nút, nhưng thay vì di chuyển đầu tiên khớp với phần đầu của danh sách). Điều đó cũng dễ dàng thực hiện với cách tiếp cận này.

+0

Không nên nó là list.Remove (nút)? –

1

Nó thực sự dễ dàng hơn rất nhiều trong C#.

function PlaceAtHead(<T> x) 
{ 
    list.Remove(x); 
    list.AddFirst(x); 
    return x; 
} 
+0

Nó không phải là những gì OP hỏi ... –

+0

Điều này không có gì để làm với câu hỏi ... –

+0

Tôi chưa thử nó, nhưng tôi tin rằng điều này sẽ tăng một ngoại lệ, bởi vì mở Enumerator ... – Antonello

1

Một tùy chọn xấu là lặp qua danh sách, tìm tất cả các mục áp dụng và lưu trữ chúng trong danh sách. Sau đó lặp qua danh sách thứ hai của bạn và gọi loại bỏ trên LinkedList của bạn ...

Tôi hy vọng ai đó có một giải pháp thanh lịch hơn :)

+0

Tôi thực sự khá thích ý tưởng đó ... – Unsliced

+0

Đó là những gì tôi nghĩ, nhưng, sang trọng ngoài, nó không thể làm việc trong mọi điều kiện, vì 2 nút trong danh sách có thể bằng nhau ... – Antonello

+0

Tôi đặt một phiên bản xuống bên dưới, điều đó cũng sẽ xử lý các bản sao. Nó dựa trên việc sử dụng LinkedList .Xoá (LinkedListNode ) –

0

Chỉ cần một chút Ngoài Reed Copsey's answer với một vị:

public static T MoveAheadAndReturn<T>(LinkedList<T> ll, Predicate<T> pred) 
    { 
     if (ll == null) 
      throw new ArgumentNullException("ll"); 
     if (pred == null) 
      throw new ArgumentNullException("pred"); 


     LinkedListNode<T> node = ll.First; 
     T value = default(T); 

     while (node != null) 
     { 
      value = node.Value; 
      if (pred(value)) 
      { 
       ll.Remove(node); 
       ll.AddFirst(node); 
       break; 
      } 
      node = node.Next; 
     } 

     return value; 
    } 
Các vấn đề liên quan