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 相关文章推荐
Windows中安装使用Virtualenv来创建独立Python环境
May 31 Python
Django接受前端数据的几种方法总结
Nov 04 Python
python 上下文管理器使用方法小结
Oct 10 Python
python利用smtplib实现QQ邮箱发送邮件
May 20 Python
Python3实现的Mysql数据库操作封装类
Jun 06 Python
python实现坦克大战游戏 附详细注释
Mar 27 Python
详解python websocket获取实时数据的几种常见链接方式
Jul 01 Python
python实现的登录与提交表单数据功能示例
Sep 25 Python
Python更新所有已安装包的操作
Feb 13 Python
python tkinter GUI绘制,以及点击更新显示图片代码
Mar 14 Python
简单了解python调用其他脚本方法实例
Mar 26 Python
Python datetime模块使用方法小结
Jun 18 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
一个很方便的 XML 类!!原创的噢
2006/10/09 PHP
cache_lite试用
2007/02/14 PHP
MySQL数据源表结构图示
2008/06/05 PHP
php制作基于xml的RSS订阅源功能示例
2017/02/08 PHP
Laravel下生成验证码的类
2017/11/15 PHP
ANT 压缩(去掉空格/注释)JS文件可提高js运行速度
2013/04/15 Javascript
js导出格式化的excel 实例方法
2013/07/17 Javascript
web前端设计师们常用的jQuery特效插件汇总
2014/12/07 Javascript
jQuery实现鼠标滑过点击事件音效试听
2015/08/31 Javascript
浅谈JavaScript中数组的增删改查
2016/06/20 Javascript
微信小程序实现图片轮播及文件上传
2017/04/07 Javascript
JavaScript操作文件_动力节点Java学院整理
2017/06/30 Javascript
基于nodejs+express4.X实现文件下载的实例代码
2017/07/13 NodeJs
angular使用bootstrap方法手动启动的实例代码
2017/07/18 Javascript
jquery tmpl模板(实例讲解)
2017/09/02 jQuery
vuejs使用递归组件实现树形目录的方法
2017/09/30 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
浅谈Python实现贪心算法与活动安排问题
2017/12/19 Python
Python编写一个优美的下载器
2018/04/15 Python
浅析Windows 嵌入python解释器的过程
2019/07/26 Python
django基于cors解决跨域请求问题详解
2019/08/06 Python
Python程序暂停的正常处理方法
2019/11/07 Python
python的json包位置及用法总结
2020/06/21 Python
HTML5 Canvas绘制圆点虚线实例
2015/01/01 HTML / CSS
西班牙最大的在线滑板和街头服饰商店:Fillow.net
2019/04/15 全球购物
经典C++面试题一
2016/11/06 面试题
大学生职业规划书的范本
2014/02/18 职场文书
好习惯伴我成长演讲稿
2014/05/21 职场文书
涪陵白鹤梁导游词
2015/02/09 职场文书
综合素质评价自我评价
2015/03/06 职场文书
通知范文怎么写
2015/04/16 职场文书
Django debug为True时,css加载失败的解决方案
2021/04/24 Python
深入讲解Vue中父子组件通信与事件触发
2022/03/22 Vue.js
《帝国时代4》赛季预告 新增内容编译器可创造地图
2022/04/03 其他游戏
Python利用capstone实现反汇编
2022/04/06 Python
我去timi了,一起去timi是什么意思?
2022/04/13 杂记