Я переписал код, чтобы быть более кратким. Чтобы добавить элементы в связанный список, необходимо рассмотреть два случая:
- Связанный список пуст или
- Связанный список имеет хотя бы один узел
def push(self, newdata):
if not self.head:
self.head = Node(newdata)
self.cur = self.head
else:
self.cur.next = Node(newdata)
self.cur = self.cur.next
Для случая, когда он пуст, мы можем проверить, пусто ли оно, используя if not self.head
. Если он пуст, мы назначаем голову новому узлу. Кроме того, мы отслеживаем текущий узел с помощью self.cur
. Таким образом, у нас всегда есть указатель на последний узел, и нам не нужно будет перебирать, когда мы добавляем больше значений. Теперь для случая, когда в связанном списке уже есть элементы, мы устанавливаем указатель next
текущего узла на новый узел. В обоих случаях мы должны переместить указатель на следующий узел.
Чтобы поменять местами узлы с двумя значениями, это немного сложнее. Есть 4 случая, которые необходимо обработать:
- x и y могут быть или не быть смежными
- x или y может быть головным узлом
- x или y может быть последним узлом
- x и / или y могут отсутствовать в связанном списке
Основная идея состоит в том, чтобы искать и находить X и Y в связанном списке, сохраняя при этом отслеживание их предыдущих и текущих указателей. Если одного из них нет, мы вернемся.
# Swapping between two nodes present in linkedlist
class Node:
def __init__(self, data):
self.data = data
self.next = None
class Linkedlist:
def __init__(self):
self.head = None
def push(self, newdata):
if not self.head:
self.head = Node(newdata)
self.cur = self.head
else:
self.cur.next = Node(newdata)
self.cur = self.cur.next
def swap_nodes(self, x, y):
# Don't swap if same
if x == y:
return
# Search for x (keep track of prev_x and CurrX)
prev_x = None
cur_x = self.head
while cur_x != None and cur_x.data != x:
prev_x = cur_x
cur_x = cur_x.next
# Search for y (keep track of prev_y and cur_y)
prev_y = None
cur_y = self.head
while cur_y != None and cur_y.data != y:
prev_y = cur_y
cur_y = cur_y.next
# If either x or y is not present, nothing to do
if cur_x == None or cur_y == None:
return
# If x is not head of linked list
if prev_x != None:
prev_x.next = cur_y
else: #make y the new head
self.head = cur_y
# If y is not head of linked list
if prev_y != None:
prev_y.next = cur_x
else: # make x the new head
self.head = cur_x
# Swap next pointers
temp = cur_x.next
cur_x.next = cur_y.next
cur_y.next = temp
def display(self):
temp = self.head
while temp:
print(temp.data)
temp = temp.next
llist = Linkedlist()
llist.push(22)
llist.push(92)
llist.push(-20)
llist.push(2)
llist.push(23)
llist.push(102)
llist.display()
print('Linked list before any swapping')
llist.swap_nodes(22,102)
llist.swap_nodes(22,-20)
llist.swap_nodes(22,13)
print(' ')
llist.display()
выход
22
92
-20
2
23
102
Linked list before any swapping
102
92
22
2
23
-20