每个node节点包含一个val,与next指针指向下个节点。实现基本的链表操作,其中反转链表操作有个小坑,需要注意。
reverse过程中设置两个滚动指针pre与cur,初始值为pre=None,cur=self.head,这样反转后能保证head.next=None。错误的方式为设置pre=self.head与cur=self.head.next,这样虽然head之后的节点(不包括head)能正确反转,但是head.next不为空,仍然指向下一个节点,结果导致第一个与第二个节点死循环。
class Node(object):
def __init__(self, val):
self.val = val
self.next = None
class LinkList(object):
def __init__(self):
self.head = None
def __len__(self):
length = 0
p = self.head
while p:
length += 1
p = p.next
return length
def print_data(self):
p = self.head
while p:
print(p.val)
p = p.next
def append(self, data):
node = Node(data)
if self.head is None:
self.head = node
else:
p = self.head
while p.next:
p = p.next
p.next = node
def get_element(self, index):
if index < 0 or index >= len(self):
return None
p = self.head
while index > 0:
p = p.next
index -= 1
return p
def locate_element(self, data):
if self.head is None:
return -1
p = self.head
index = 0
while p:
if p.val == data:
return index
p = p.next
index += 1
return -1
def insert(self, index, data):
node = Node(data)
if index < 0 or index >= len(self):
return None
if index == 0:
node.next = self.head
self.head = node
else:
p = self.get_element(index-1)
node.next = p.next
p.next = node
def delete(self, index):
if index < 0 or index >= len(self):
return False
if len(self) == 1:
self.head = None
else:
p = self.get_element(index-1)
p.next = p.next.next
return True
def reverse(self):
if len(self) <= 1:
return
else:
pre = None
cur = self.head
while cur:
tem = cur.next
cur.next = pre
pre = cur
cur = tem
self.head = pre
def clear_list(self):
self.head = None
def list_length(self):
return len(self)
def is_empty(self):
return self.head is None
linklist = LinkList()
linklist.append(1)
linklist.append(2)
linklist.append(3)
linklist.append(4)
print('length is %d'%len(linklist))
print('------')
linklist.print_data()
print('------')
linklist.insert(2, 10)
print('------')
linklist.print_data()
print('------')
linklist.delete(3)
print('------')
linklist.print_data()
print('------')
linklist.reverse()
print('------')
linklist.print_data()
print('------')
运行结果如下。