123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- class Node(object):
- def __init__(self, value):
- self.value = value
- self.next = None
- class LinkedListOneway(object):
- def __init__(self, node=None):
- self.__head = node
- def get_head(self):
- return self.__head
- def __len__(self):
- cur = self.__head
- count = 0
- while cur:
- count += 1
- cur = cur.next
- return count
- def is_empty(self):
- return self.__head == None
- def add(self, value):
- """
- 头插法
- 先让新节点的next指向头节点
- 再将头节点替换为新节点
- 顺序不可错,要先保证原链表的链不断,否则头节点后面的链会丢失
- """
- node = Node(value)
- node.next = self.__head
- self.__head = node
- def append(self, value):
- """
- 尾插法
- :param value:
- :return:
- """
- node = Node(value)
- cur = self.__head
- if self.is_empty():
- self.__head = node
- else:
- while cur.next:
- cur = cur.next
- cur.next = node
- def insert(self, pos, value):
- # 插入指定位置
- if pos <= 0:
- self.add(value)
- elif pos > len(self) - 1:
- self.append(value)
- else:
- node = Node(value)
- prior = self.__head
- count = 0
- # 在插入位置的前一个节点停下
- while count < (pos - 1):
- prior = prior.next
- count += 1
- # 先将插入节点与节点后的节点连接,防止链表断掉,先链接后面的,再链接前面的
- node.next = prior.next
- prior.next = node
- def remove_value(self, value):
- """
- 删除值
- :param value:
- :return:
- """
- curr = self.__head
- if curr is None:
- raise Exception("链表为空,无法删除值")
- i = 0
- while curr:
- if curr.value == value:
- break
- curr = curr.next
- i += 1
- prior = self.__head
- j = 0
- k = i
- while prior:
- if j == k - 1:
- print(j)
- break
- prior = prior.next
- j += 1
- if i == 0:
- self.__head = self.__head.next
- elif i > self.__len__() - 1:
- raise Exception("未查询到此数据")
- elif 0 < i < self.__len__() - 1:
- nextnext = prior.next
- prior.next = nextnext.next
- else:
- pass
- print("删除的值为:%s 位置为:%s" % (value, i))
- def remove_index(self, index):
- cur = self.__head
- if cur is None:
- raise Exception('链表为空,无法删除')
- if index > self.__len__():
- raise Exception('下标越界')
- stu = self.__head
- for i in range(index - 1):
- stu = stu.nex
- temp = stu.next
- stu.next = temp.next
- def search(self, value):
- cur = self.__head
- if cur is None:
- raise Exception('链表为空')
- while cur is not None:
- if cur.value == value:
- return True
- else:
- cur = cur.next
- return False
- def reverse(self):
- cur = self.__head
- pre = None
- while cur:
- prenext = cur.next
- cur.next = pre
- pre = cur
- cur = prenext
- self.__head = pre
- def show(self):
- cur = self.__head
- while cur:
- print(cur.value)
- cur = cur.next
- if __name__ == '__main__':
- head = LinkedListOneway()
- head.append(1)
- head.append(2)
- head.append(3)
- head.insert(2, 5)
- head.remove_value(3)
- # head.reverse()
- head.show()
|