- Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlinkedlist.py
More file actions
Latest commit
139 lines (118 loc) · 3.06 KB
/
Copy pathlinkedlist.py
File metadata and controls
139 lines (118 loc) · 3.06 KB
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
classNode:
def__init__(self, data=0, next=None):
self.data=data
self.next=next
def__repr__(self):
return'Node(%r)'%self.data
classLinkedList:
def__init__(self, iter=()):
self.next=None
node=self
foroiniter:
node.next=node=Node(o)
@property
defhead(self):
returnself.next
def__bool__(self):
returnself.nextisnotNone
def__repr__(self):
return'LinkedList([%s])'%', '.join(map(repr, self))
def__len__(self):
n=0
node=self.next
whilenode:
n+=1
node=node.next
returnn
def__iter__(self):
node=self.next
whilenode:
yieldnode.data
node=node.next
defnodes(self):
node=self.next
whilenode:
yieldnode
node=node.next
deftail(self):
node=self
whilenode.next:
node=node.next
returnnode
definsert(self, value, node=None):
node=nodeorself
node.next=Node(value, node.next)
returnnode.next
defremove(self, node=None):
node=nodeorself
ifnotnode.next:
raiseValueError("can't remove past last node")
node.next=node.next.next
definsert_all(self, values, node=None):
node=nodeorself
forvalueinvalues:
node=self.insert(value, node)
returnnodeifnodeisnotselfelseNone
defremove_all(self, node1=None, node2=None):
node1=node1orself
whilenode1.next!=node2:
self.remove(node1)
deffind(self, value):
node=self.next
whilenode:
ifnode.data==value:
returnnode
node=node.next
returnnode
deffind_prev(self, value):
node=self
whilenode.next:
ifnode.next.data==value:
returnnode
node=node.next
returnnodeifnodeisnotselfelseNone
defreverse(self):
prev=None
node=self.next
whilenode:
next=node.next
node.next=prev
prev=node
node=next
self.next=prev
returnself
defmerge(l1, l2):
l3=LinkedList()
n1=l1.next
n2=l2.next
n3=None
whilen1orn2:
ifn1and (notn2orn1.data<=n2.data):
val=n1.data
n1=n1.next
else:
val=n2.data
n2=n2.next
n3=l3.insert(val, n3)
returnl3
defadd(l1, l2):
l3=LinkedList()
n1=l1.next
n2=l2.next
n3=None
c=0
last=None
whilen1orn2:
x1=n1.dataifn1else0
x2=n2.dataifn2else0
c, s=divmod(x1+x2+c, 10)
n3=l3.insert(s, n3)
ifs:
last=n3
n1=n1andn1.next
n2=n2andn2.next
ifc:
l3.insert(c, n3)
else:
l3.remove_all(last)
returnl3