Delete duplicates from a singly linked list

I can use a buffer, and that runs in O(N), or I can use no buffer and runner pointers and that runs in O(N^2).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
class Node(object):
    def __init__(self, value):
        self.value = value
        self.next = None
 
 
class LinkedList(object):
    head = None
 
    def append(self, value):
        new_node = Node(value)
 
        if self.head is None:
            self.head = new_node
            return
 
        n = self.head
        while n.next is not None:
            n = n.next
 
        n.next = new_node
 
 
    def show(self):
        n = self.head
        while n is not None:
            print n.value,
            n = n.next
        print
 
 
    def delDup(self):
        l = []
        n = self.head
        l.append(n.value)
 
        while n.next is not None:
            if n.next.value in l:
                n.next = n.next.next
            else:
                l.append(n.next.value)
                n = n.next
 
 
    def delDupNoBuf(self):
        current = self.head
 
        while current is not None:
            runner = current
            while runner.next is not None:
                if runner.next.value == current.value:
                    runner.next = runner.next.next
                else:
                    runner = runner.next
            current = current.next
 
 
 
l = LinkedList()
l.append(10)
l.append(10)
l.append(20)
l.append(10)
l.delDup()
l.append(20)
l.delDupNoBuf()
l.show()