首先,在单链表的众多用法中,我着重说一下反转应用吧,这也是我花费了较长时间理解的内容,先上图:
如何理解以上图形:cur 指针指向当前节点,pre指针指向前一个节点,反转单链表的重点在于反转指针的指向方向,并且循环此过程;所以,cur的next指针方向需要指向pre节点,同时,需要注意的是,cur.next的节点地址需要提前保存出来,赋值给一个temp变量,省的在向后循环时候找不到具体方位;除此之外,不要忘记在本次循环结束时,将self.head节点指向pre指针位置,重复循环,具体详见代码:
#encoding=utf-8 class Node(object): def __init__(self,val,p=0): self.val = val self.next = p class Linklist(object): def __init__(self): self.head = None def __len__(self): len = 0 p = self.head while p: len += 1 p = p.next return len 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: cur = self.head pre = None while cur: temp = cur.next cur.next = pre pre = cur cur = temp self.head = pre linklist = Linklist() linklist.append(1) linklist.append(2) linklist.append(3) linklist.append(4) linklist.append(5) print('length is %d'%len(linklist)) print('-'*20) linklist.print_data() print('-'*20) print(linklist) linklist.insert(3, 7) linklist.print_data() print('-'*20) linklist.delete(2) linklist.print_data() print('-'*20) linklist.reverse() linklist.print_data()运行结果如下:
length is 5
--------------------
1
2
3
4
5
--------------------
<__main__.Linklist object at 0x00000000029A87F0>
1
2
3
7
4
5
--------------------
1
2
7
4
5
--------------------
5
4
7
2
1
Process finished with exit code 0