python 实现数据结构 lesson 1 单链表

    首先,在单链表的众多用法中,我着重说一下反转应用吧,这也是我花费了较长时间理解的内容,先上图:

  如何理解以上图形: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值