Advertisement
Olenji

Untitled

Oct 18th, 2017
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.53 KB | None | 0 0
  1. class ListNode:
  2.     def __init__(self, data, prev = None, link = None):
  3.         self.data = data
  4.         self.prev = prev
  5.         self.link = link
  6.         if prev is not None:
  7.             self.prev.link = self
  8.         if link is not None:
  9.             self.link.prev = self
  10.  
  11. class DoublyLinkedList:
  12.     def __init__(self):
  13.         self._head = None
  14.         self._tail = None
  15.         self._length = 0
  16.  
  17.     @property
  18.     def head(self):
  19.         return self._head
  20.  
  21.     @property
  22.     def tail(self):
  23.         return self._tail
  24.    
  25.     def _addbetween(self, item, before, after):
  26.         node = ListNode(item, before, after)
  27.         if after is self._head:
  28.             self._head = node
  29.         if before is self._tail:
  30.             self._tail = node
  31.         self._length += 1
  32.  
  33.     def addfirst(self, item):
  34.         self._addbetween(item, None, self._head)
  35.        
  36.     def addlast(self, item):
  37.         self._addbetween(item, self._tail, None)
  38.  
  39.     def _remove(self, node):
  40.         before, after = node.prev, node.link
  41.         if node is self._head:
  42.             self._head = after
  43.         else:
  44.             before.link = after
  45.         if node is self._tail:
  46.             self._tail = before
  47.         else:
  48.             after.prev = before
  49.         self._length -= 1
  50.         return node.data
  51.  
  52.     def removefirst(self):
  53.         return self._remove(self._head)
  54.  
  55.     def removelast(self):
  56.         return self._remove(self._tail)
  57.    
  58.     def __len__(self):
  59.         return self._length
  60.  
  61. class DoublyLinkedNumber(DoublyLinkedList):
  62.     def __init__(self):
  63.         self._L = DoublyLinkedList()
  64.  
  65.     def tolinkednumber(self, string):
  66.         for i in range(len(string)):
  67.             if string.startswith('0'): string = string[1:]
  68.         for s in string:
  69.             self._L.addlast(s)
  70.  
  71.     def __str__(self):
  72.         storedstring = ''
  73.         for l in range(self._L.__len__()):
  74.             ph = self._L.removefirst()
  75.             storedstring = storedstring + str(ph)
  76.             self._L.addlast(ph)
  77.         return storedstring
  78.  
  79.     def head(self):
  80.         return self._L._head
  81.  
  82.     def tail(self):
  83.         return self._L._tail
  84.  
  85.     def addfirst(self, item):
  86.         self._L.addfirst(item)
  87.  
  88. ## To-Do : Addition of numbers present in the 2 DoublyLinkedLists.
  89. ## Start from the tail and traverse backwards.
  90. ## Perform addition on data of nodes and account for carry generated
  91. ## Store the sum in a new doubly linked list
  92. def sumlinkednumbers(dll1, dll2):
  93.     dllsum = DoublyLinkedNumber()
  94.     c1 = dll1.tail()
  95.     c2 = dll2.tail()
  96.     carry = 0
  97.  
  98.     while c1 or c2 is not None:
  99.         #print('Start---')
  100.  
  101.         if c2 is None:
  102.             sum = int(c1.data)
  103.             #print(c1.data)
  104.             #print('SUM: ', sum)
  105.         elif c1 is None:
  106.             sum = int(c2.data)
  107.             #print(c2.data)
  108.             #print('SUM: ', sum)
  109.         else:
  110.             sum = int(c1.data) + int(c2.data)
  111.             #print(c1.data)
  112.             #print(c2.data)
  113.             #print('SUM: ', sum)
  114.            
  115.         if carry > 0:
  116.             sum = int(sum) + carry
  117.             carry = 0
  118.             #print('Calc carry', sum, carry)
  119.         if int(sum) > 10:
  120.             carry += 1
  121.             sum = int(sum) - 10
  122.             #print('Has carry', sum, carry)
  123.        
  124.         dllsum.addfirst(sum)
  125.        
  126.         if c2 is None:
  127.             c1 = c1.prev
  128.         elif c1 is None:
  129.             c2 = c2.prev
  130.         else:
  131.             c1 = c1.prev
  132.             c2 = c2.prev
  133.         #print('---End')
  134.     return dllsum
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement