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实现的飞速中文网小说下载脚本
Apr 23 Python
python3新特性函数注释Function Annotations用法分析
Jul 28 Python
python下10个简单实例代码
Nov 15 Python
Python使用 Beanstalkd 做异步任务处理的方法
Apr 24 Python
pycharm下查看python的变量类型和变量内容的方法
Jun 26 Python
python看某个模块的版本方法
Oct 16 Python
python opencv读mp4视频的实例
Dec 07 Python
简单了解python变量的作用域
Jul 30 Python
python使用Word2Vec进行情感分析解析
Jul 31 Python
Pycharm自带Git实现版本管理的方法步骤
Sep 18 Python
Python常用配置文件ini、json、yaml读写总结
Jul 09 Python
python3 字符串str和bytes相互转换
Mar 23 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数组 为文章加关键字连接 文章内容自动加链接
2011/12/29 PHP
PHP5中实现多态的两种方法实例分享
2014/04/21 PHP
Smarty中的注释和截断功能介绍
2015/04/09 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
跟随鼠标旋转的文字
2006/11/30 Javascript
Javascript客户端将指定区域导出到Word、Excel的代码
2008/10/22 Javascript
jquery实现的导航固定效果
2014/04/28 Javascript
浅谈javascript 迭代方法
2015/01/21 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
一篇文章掌握RequireJS常用知识
2016/01/26 Javascript
JS传值出现中文参数乱码的解决方法
2016/06/30 Javascript
React中使用UEditor百度富文本的方法
2018/08/22 Javascript
JS Object.preventExtensions(),Object.seal()与Object.freeze()用法实例分析
2018/08/25 Javascript
微信小程序实现日期格式化和倒计时
2020/11/01 Javascript
JQuery实现ul中添加LI和删除指定的Li元素功能完整示例
2019/10/16 jQuery
js实现树形数据转成扁平数据的方法示例
2020/02/27 Javascript
vue style width a href动态拼接问题的解决
2020/08/07 Javascript
在Ubuntu系统下安装使用Python的GUI工具wxPython
2016/02/18 Python
python实现读取excel写入mysql的小工具详解
2017/11/20 Python
使用python实现knn算法
2017/12/20 Python
解决pycharm界面不能显示中文的问题
2018/05/23 Python
Python语言异常处理测试过程解析
2020/01/08 Python
Django media static外部访问Django中的图片设置教程
2020/04/07 Python
TensorFlow的reshape操作 tf.reshape的实现
2020/04/19 Python
python开发前景如何
2020/06/11 Python
python palywright库基本使用
2021/01/21 Python
台湾前三大B2C购物网站:MOMO购物网
2017/04/27 全球购物
雅萌 (YA-MAN) :日本美容家电领域的龙头企业
2017/05/12 全球购物
JNI的定义
2012/11/25 面试题
成语的广告词
2014/03/19 职场文书
农民工工资承诺书范文
2014/03/31 职场文书
小学校园广播稿(3篇)
2014/09/19 职场文书
士兵突击观后感
2015/06/16 职场文书
2016年教师党员承诺书范文
2016/03/24 职场文书
AJAX实现省市县三级联动效果
2021/10/16 Javascript