public static SinglyLinkedList <T> Remove <T>(this SinglyLinkedList <T> list, T value) { // O(N) if (list.Value.Equals(value)) { return(list.Next); } var current = list.Next; while (current != null) { if (current.Value.Equals(value)) { break; } current = current.Next; } if (current == null) { // item not found return(list); } var newList = new SinglyLinkedList <T>(list.Value); var item = list.Next; while (item != current) { newList = newList.Cons(item.Value); item = item.Next; } // skip current, as that is the one to be deleted newList.Append(current.Next); return(newList); }
static void Main(string[] args) { SinglyLinkedList test = new SinglyLinkedList(); Console.WriteLine("Test: "); test.AddFirst(10); test.AddFirst(20); test.AddFirst(30); test.AddFirst(40); Console.WriteLine("Singly Linked List After: AddFirst(10), AddFirst(20), AddFirst(30), AddFirst(40)"); test.Print(); Console.WriteLine(); test.AddLast(50); test.AddLast(60); Console.WriteLine("Singly Linked List After: AddLast(50), AddLast(60)"); test.Print(); Console.WriteLine(); test.Append(70); Console.WriteLine("Singly Linked List After: Append(70)"); test.Print(); Console.WriteLine(); test.DeleteFirst(); test.DeleteFirst(); Console.WriteLine("Singly Linked List After: DeleteFirst() Twice"); test.Print(); Console.WriteLine(); test.DeleteLast(); Console.WriteLine("Singly Linked List After: DeleteLast()"); test.Print(); Console.WriteLine(); test.Insert(4, 3); test.Insert(5, 1); Console.WriteLine("Singly Linked List After: Insert(4,3), Insert(5,1)"); test.Print(); Console.WriteLine(); test.Delete(2); test.Delete(3); Console.WriteLine("Singly Linked List After: Delete(2), Delete(3)"); test.Print(); Console.WriteLine(); Console.WriteLine(); Console.WriteLine("Error Test: "); Console.WriteLine("No Values Have Been Inserted Into Linked List"); Console.WriteLine(); SinglyLinkedList error = new SinglyLinkedList(); Console.WriteLine("Singly Linked List Error Message After: Print()"); Console.WriteLine(); error.Print(); Console.WriteLine(); Console.WriteLine("Singly Linked List Error Message After: DeleteFirst()"); Console.WriteLine(); error.DeleteFirst(); Console.WriteLine(); Console.WriteLine("Singly Linked List Error Message After: DeleteLast()"); Console.WriteLine(); error.DeleteLast(); Console.WriteLine(); Console.WriteLine("Singly Linked List After Insert(27, 0) With No Values In List"); Console.WriteLine(); Console.WriteLine("AddFirst() Will Be Called Instead: "); Console.WriteLine(); error.Insert(27, 0); error.Print(); Console.WriteLine(); Console.WriteLine(); Console.WriteLine("Singly Linked List Error Message After Delete() Called Twice"); Console.WriteLine(); error.Delete(0); error.Print(); error.Delete(0); }