python环形单链表的约瑟夫问题详解


Posted in Python onSeptember 27, 2018

题目:

一个环形单链表,从头结点开始向后,指针每移动一个结点,就计数加1,当数到第m个节点时,就把该结点删除,然后继续从下一个节点开始从1计数,循环往复,直到环形单链表中只剩下了一个结点,返回该结点。

这个问题就是著名的约瑟夫问题。

代码:

首先给出环形单链表的数据结构:

class Node(object):
 def __init__(self, value, next=0):
  self.value = value
  self.next = next # 指针

class RingLinkedList(object):
 # 链表的数据结构
 def __init__(self):
  self.head = 0 # 头部

 def __getitem__(self, key):
  if self.is_empty():
   print 'Linked list is empty.'
   return
  elif key < 0 or key > self.get_length():
   print 'The given key is wrong.'
   return
  else:
   return self.get_elem(key)

 def __setitem__(self, key, value):
  if self.is_empty():
   print 'Linked list is empty.'
   return
  elif key < 0 or key > self.get_length():
   print 'The given key is wrong.'
   return
  else:
   return self.set_elem(key, value)

 def init_list(self, data): # 按列表给出 data
  self.head = Node(data[0])
  p = self.head # 指针指向头结点
  for i in data[1:]:
   p.next = Node(i) # 确定指针指向下一个结点
   p = p.next # 指针滑动向下一个位置
  p.next = self.head

 def get_length(self):
  p, length = self.head, 0
  while p != 0:
   length += 1
   p = p.next
   if p == self.head:
    break
  return length

 def is_empty(self):
  if self.head == 0:
   return True
  else:
   return False

 def insert_node(self, index, value):
  length = self.get_length()
  if index < 0 or index > length:
   print 'Can not insert node into the linked list.'
  elif index == 0:
   temp = self.head
   self.head = Node(value, temp)
   p = self.head
   for _ in xrange(0, length):
    p = p.next
   print "p.value", p.value
   p.next = self.head
  elif index == length:
   elem = self.get_elem(length-1)
   elem.next = Node(value)
   elem.next.next = self.head
  else:
   p, post = self.head, self.head
   for i in xrange(index):
    post = p
    p = p.next
   temp = p
   post.next = Node(value, temp)

 def delete_node(self, index):
  if index < 0 or index > self.get_length()-1:
   print "Wrong index number to delete any node."
  elif self.is_empty():
   print "No node can be deleted."
  elif index == 0:
   tail = self.get_elem(self.get_length()-1)
   temp = self.head
   self.head = temp.next
   tail.next = self.head
  elif index == self.get_length()-1:
   p = self.head
   for i in xrange(self.get_length()-2):
    p = p.next
   p.next = self.head
  else:
   p = self.head
   for i in xrange(index-1):
    p = p.next
   p.next = p.next.next

 def show_linked_list(self): # 打印链表中的所有元素
  if self.is_empty():
   print 'This is an empty linked list.'
  else:
   p, container = self.head, []
   for _ in xrange(self.get_length()-1): #
    container.append(p.value)
    p = p.next
   container.append(p.value)
   print container

 def clear_linked_list(self): # 将链表置空
  p = self.head
  for _ in xrange(0, self.get_length()-1):
   post = p
   p = p.next
   del post
  self.head = 0

 def get_elem(self, index):
  if self.is_empty():
   print "The linked list is empty. Can not get element."
  elif index < 0 or index > self.get_length()-1:
   print "Wrong index number to get any element."
  else:
   p = self.head
   for _ in xrange(index):
    p = p.next
   return p

 def set_elem(self, index, value):
  if self.is_empty():
   print "The linked list is empty. Can not set element."
  elif index < 0 or index > self.get_length()-1:
   print "Wrong index number to set element."
  else:
   p = self.head
   for _ in xrange(index):
    p = p.next
   p.value = value

 def get_index(self, value):
  p = self.head
  for i in xrange(self.get_length()):
   if p.value == value:
    return i
   else:
    p = p.next
  return -1

然后给出约瑟夫算法:

def josephus_kill_1(head, m):
  '''
  环形单链表,使用 RingLinkedList 数据结构,约瑟夫问题。
  :param head:给定一个环形单链表的头结点,和第m个节点被杀死
  :return:返回最终剩下的那个结点
  本方法比较笨拙,就是按照规定的路子进行寻找,时间复杂度为o(m*len(ringlinkedlist))
  '''
  if head == 0:
   print "This is an empty ring linked list."
   return head
  if m < 2:
   print "Wrong m number to play this game."
   return head
  p = head
  while p.next != p:
   for _ in xrange(0, m-1):
    post = p
    p = p.next
   #print post.next.value
   post.next = post.next.next
   p = post.next
  return p

分析:

我采用了最原始的方法来解决这个问题,时间复杂度为o(m*len(ringlinkedlist))。
但是实际上,如果确定了链表的长度以及要删除的步长,那么最终剩余的结点一定是固定的,所以这就是一个固定的函数,我们只需要根剧M和N确定索引就可以了,这个函数涉及到了数论,具体我就不细写了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用三角迭代计算圆周率PI的方法
Mar 20 Python
Python中的fileinput模块的简单实用示例
Jul 09 Python
浅谈python中copy和deepcopy中的区别
Oct 23 Python
python3.x上post发送json数据
Mar 04 Python
对Python中gensim库word2vec的使用详解
May 08 Python
Python装饰器语法糖
Jan 02 Python
在Python中表示一个对象的方法
Jun 25 Python
利用Python复制文件的9种方法总结
Sep 02 Python
Windows10+anacond+GPU+pytorch安装详细过程
Mar 24 Python
Python 测试框架unittest和pytest的优劣
Sep 26 Python
Python pyecharts绘制条形图详解
Apr 02 Python
python中mongodb包操作数据库
Apr 19 Python
transform python环境快速配置方法
Sep 27 #Python
python如何求解两数的最大公约数
Sep 27 #Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
Sep 27 #Python
python斐波那契数列的计算方法
Sep 27 #Python
python实现汉诺塔算法
Mar 01 #Python
Python3中bytes类型转换为str类型
Sep 27 #Python
python求解数组中两个字符串的最小距离
Sep 27 #Python
You might like
PHP中MD5函数使用实例代码
2008/06/07 PHP
php插入中文到sqlserver 2008里出现乱码的解决办法分享
2012/07/19 PHP
那些年我们错过的魔术方法(Magic Methods)
2014/01/14 PHP
php的sprintf函数的用法 控制浮点数格式
2014/02/14 PHP
javascript 文章截取部分无损html显示实现代码
2010/05/04 Javascript
JavaScript 事件系统
2010/07/22 Javascript
javascript 闭包详解
2015/07/02 Javascript
jquery仅用6行代码实现滑动门效果
2015/09/07 Javascript
JavaScript 对象字面量讲解
2016/06/06 Javascript
javascript 四十条常用技巧大全
2016/09/09 Javascript
详解Vue2.X的路由管理记录之 钩子函数(切割流水线)
2017/05/02 Javascript
手写Node静态资源服务器的实现方法
2018/03/20 Javascript
使用Angular CLI生成路由的方法
2018/03/24 Javascript
原生JS实现前端本地文件上传
2018/09/08 Javascript
vue 利用路由守卫判断是否登录的方法
2018/09/29 Javascript
node版本管理工具n包使用教程详解
2018/11/09 Javascript
vue2.0 如何在hash模式下实现微信分享
2019/01/22 Javascript
微信小程序结合mock.js实现后台模拟及调试
2019/03/28 Javascript
vue轻量级框架无法获取到vue对象解决方法
2019/05/12 Javascript
vue项目中常见问题及解决方案(推荐)
2019/10/21 Javascript
[01:00:26]Ti4主赛事胜者组第一天 EG vs NEWBEE 1
2014/07/19 DOTA
Python实现的飞速中文网小说下载脚本
2015/04/23 Python
python实现文件快照加密保护的方法
2015/06/30 Python
windows下添加Python环境变量的方法汇总
2018/05/14 Python
Django实现auth模块下的登录注册与注销功能
2019/10/10 Python
python爬虫使用正则爬取网站的实现
2020/08/03 Python
收集的22款给力的HTML5和CSS3帮助工具
2012/09/14 HTML / CSS
瑞典首都斯德哥尔摩的多元奢侈时尚品牌:Acne Studios
2017/07/09 全球购物
会计专业自我鉴定范文
2013/10/06 职场文书
《海底世界》教学反思
2014/04/16 职场文书
环保项目建议书
2014/08/26 职场文书
永远跟党走演讲稿
2014/09/12 职场文书
刑事代理授权委托书
2014/09/17 职场文书
2015年政风行风工作总结
2015/04/21 职场文书
python如何利用cv2模块读取显示保存图片
2021/06/04 Python
Java界面编程实现界面跳转
2022/06/16 Java/Android