from collections import Iterable
from warnings import warn
class ListNode(object):
"""链表结点"""
def __init__(self, val, next=None):
self.val = val
self.next = next
def __repr__(self):
return str(self.val)
class LinkedList(object):
"""Python单向链表"""
def __init__(self, data=None):
if data is None:
self.head = None
self.__length = 0
elif isinstance(data, ListNode):
self.head = data
self.__length = 1
elif isinstance(data, Iterable):
self.head = None
self.__length = 0
for v in data:
self.append(v)
else:
self.head = ListNode(data)
self.__length = 1
def isEmpty(self):
return (self.__length == 0)
def append(self, valOrNode):
"""在当前链表的末尾追加元素。"""
elem = None
if isinstance(valOrNode, ListNode):
if valOrNode.next is not None:
warn("valOrNode.next is not None, new ListNode will be cloned. "
"If you want to append all follow-up nodes, please use 'extend'.")
elem = ListNode(valOrNode.val)
else:
elem = valOrNode
else:
elem = ListNode(valOrNode)
elem.next = None
if self.head is None:
self.head = elem
else:
node = self.head
while node.next:
node = node.next
node.next = elem
self.__length += 1
def extend