LeetCode初级算法的Python实现--链表

之前没有接触过Python编写的链表,所以这里记录一下思路。这里前面的代码是和leetcode中的一样,因为做题需要调用,所以下面会给出。

首先定义链表的节点类。

# 链表节点
class ListNode(object):
def __init__(self, x):
self.val = x # 节点值
self.next = None

其次分别定义将列表转换成链表将链表转换成字符串的函数;

# 将列表转换成链表
def stringToListNode(input):
numbers = input
dummyRoot = ListNode(0)
ptr = dummyRoot
for number in numbers:
ptr.next = ListNode(number)# 分别将列表中每个数转换成节点
ptr = ptr.next
ptr = dummyRoot.next
return ptr # 将链表转换成字符串
def listNodeToString(node):
if not node:
return "[]"
result = ""
while node:
result += str(node.val) + ", "
node = node.next
return "[" + result[:-2] + "]"

leetcode初级算法链表相关代码如下:

class Solution(object):
# 删除链表中的节点
def deleteNode(self, node):
"""
:type node: ListNode
:rtype: void Do not return anything, modify node in-place instead.
"""
node.val = node.next.val
node.next = node.next.next
# print(listNodeToString(node))
# 删除链表的倒数第N个节点
def removeNthFromEnd(self, head, n):
"""
:type head: ListNode
:type n: int
:rtype: ListNode
"""
listNode = []
while head:# 将每个节点存放在列表中
listNode.append(head)
head = head.next
if 1 <= n <= len(listNode):# 如果n在列表个数之内的话
n = len(listNode) - n# n原本是倒数位置,现在赋值为正方向位置
if n == 0:# 如果是删除第1个位置的节点
if len(listNode) > 1:# 如果节点总数大于1
listNode[0].val = listNode[1].val# 删除第1个位置
listNode[0].next = listNode[1].next
else:
return None# 因为节点一共就1个或0个,所以删除1个直接返回None
else:
listNode[n - 1].next = listNode[n].next# 将该节点的上一个节点的后节点赋值为该节点的后节点,即删除该节点
return listNode[0]
# 反转链表
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
listNode = []
while head:
listNode.append(head)
head = head.next
if len(listNode) == 0:
return None
for i in range(int(len(listNode) / 2)):# 将节点的值收尾分别调换
listNode[i].val, listNode[len(listNode) - i - 1].val = listNode[len(listNode) - i - 1].val, listNode[i].val
return listNode[0]
# 合并两个有序链表
def mergeTwoLists(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
newList = ListNode(0)
newList.next = l1
prev= newList# 获得新链表 while l2:
if not l1:# 如果l1不存在,直接返回l2即可
prev.next = l2
break
if l1.val > l2.val:# 1,判断l1和l2哪个大,如果l2小,则将新节点的后面设为l2的头节点,并将头节点的后面设置为l1,反之l1小,则直接将头节点的后面设置为l1,并将节点后移
temp = l2
l2 = l2.next
prev.next = temp
temp.next = l1
prev = prev.next#
else:# 反之l2大于l1,则是l1节点向后移
l1, prev = l1.next, l1
return newList.next
# 回文链表
def isPalindrome(self, head):
"""
:type head: ListNode
:rtype: bool
"""
listNode = []
while head:
listNode.append(head)
head = head.next
for i in range(int(len(listNode) / 2)):# 判断两头的值是否一样大
if listNode[i].val != listNode[len(listNode) - i - 1].val:
return False
return True
# 环形链表
def hasCycle(self, head):
"""
:type head: ListNode
:rtype: bool
"""
if not head:
return False
p1=p2=head
while p2.next and p2.next.next:# p1走1步,p2走两步,如果在链表没走完的情况下,找到完全相同的节点,就是找到环了
p1=p1.next
p2=p2.next.next
if p1==p2:
return True
return False head = [1,2,3,4,5]
head2 = [4, 5, 8, 9]
s = Solution() # print(s.deleteNode(stringToListNode(head)))
# print(listNodeToString(s.removeNthFromEnd(stringToListNode(head), 1))) # 删除倒数第一个位置
# print(listNodeToString(s.reverseList(stringToListNode(head)))) # 翻转
# print(listNodeToString(s.mergeTwoLists(stringToListNode(head2), stringToListNode(head)))) # 合并两个链表
# print(s.isPalindrome(stringToListNode(head)))
# print(s.hasCycle(stringToListNode(head)))

LeetCode初级算法的Python实现--链表的更多相关文章

  1. LeetCode初级算法的Python实现--排序和搜索、设计问题、数学及其他

    LeetCode初级算法的Python实现--排序和搜索.设计问题.数学及其他 1.排序和搜索 class Solution(object): # 合并两个有序数组 def merge(self, n ...

  2. LeetCode初级算法的Python实现--字符串

    LeetCode初级算法的Python实现--字符串 # 反转字符串 def reverseString(s): return s[::-1] # 颠倒数字 def reverse(x): if x ...

  3. LeetCode初级算法的Python实现--数组

    LeetCode初级算法的Python实现--数组 # -*- coding: utf-8 -*- """ @Created on 2018/6/3 17:06 @aut ...

  4. LeetCode初级算法的Python实现--动态规划

    动态规划的本质是递归:所以做题之前一定要会递归:递归式就是状态转移方程:这里将会介绍使用动态规划做题的思维方式. 统一的做题步骤: 1.用递归的方式写出代码:(此方法写的代码在leetcode中一定会 ...

  5. LeetCode初级算法--链表01:反转链表

    LeetCode初级算法--链表01:反转链表 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/ ...

  6. LeetCode初级算法--链表02:合并两个有序链表

    LeetCode初级算法--链表02:合并两个有序链表 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...

  7. LeetCode初级算法--数组01:只出现一次的数字

    LeetCode初级算法--数组01:只出现一次的数字 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...

  8. LeetCode初级算法--数组02:旋转数组

    LeetCode初级算法--数组02:旋转数组 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/ ...

  9. LeetCode初级算法--字符串01:反转字符串

    LeetCode初级算法--字符串01:反转字符串 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...

随机推荐

  1. js函数 标签: javascript 2016-08-12 16:48 56人阅读 评论(0) 收藏

    函数实际上是对象,函数名实际上也是一个指向函数对象的指针. 使用不带圆括号的函数名是访问函数指针,而非调用函数. 函数声明和函数表达式: alert(test(2,3)); function test ...

  2. 一个U盘黑掉你:TEENSY实战

    从传统意义讲,当你在电脑中插入一张CD/DVD光盘,或者插入一个USB设备时,可以通过自动播放来运行一个包含恶意的文件,不过自动播放功能被关闭时,autorun.inf文件就无法自动执行你的文件了.然 ...

  3. Ettercap结合sslstrip对ssl/https进行攻击

    Ettercap是一个非常强大的嗅探欺骗工具:在以往的ettercap的使用过程中,我们大多用来嗅探http,ftp,和一些加密比较简单的邮箱等的密码,对于新型的ssl/https等的加密协议就显得不 ...

  4. bzoj3609 [Heoi2014]人人尽说江南好

    Description 小 Z 是一个不折不扣的 ZRP(Zealot Round-game Player,回合制游戏狂热玩家),最近他 想起了小时候在江南玩过的一个游戏.    在过去,人们是要边玩 ...

  5. fastTime格式化时间

    { field: 'alarmTime', title: '告警时间', align: 'center', width: 90, valign: 'middle', formatter:functio ...

  6. Cesium.js学习第三天(模型展示)

    var viewer = new Cesium.Viewer('cs'); viewer.scene.primitives.add(Cesium.Model.fromGltf({ url : '/Ce ...

  7. 走进__proto__属性,看ie是否支持它,谁又来给他归宿

    每一个引用类型的实例中,都有一个指针,指向其原型对象.这个指针在非IE浏览器里通过__proto__表示,而在IE里不提供. 看如下代码: obj = {}; obj.__proto__.toStri ...

  8. 不用循环,、es6创建一个长度为100的数组

    问题描述:在不使用循环的条件下,如何创建一个长度为100的数组,并且数组的每一个元素是该元素的下标? 结果为: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1 ...

  9. ssm框架基础搭建

    1项目搭建环境  windows10+eclipse4.8+tomcat7+jdk1.7 2.使用maven搭建 1)首先eclipse配置好maven环境 2)file--new--other 3) ...

  10. SQL中对连表查询的建议

    多表连查时,如果存在多个唯一键可以做关联,尽可能选择有意义的code或name,能不选择无意义的id或者uuid最好! 所以在存储的时候也是这样,并且从始至终保持一致性.这样既降低了维护和阅读的难度, ...