【问题标题】:Convert string to a linkedlist in Python在 Python 中将字符串转换为链表
【发布时间】:2018-06-26 16:15:33
【问题描述】:

这就是我定义链接列表的方式

class ListNode(object):
     def __init__(self, x):
         self.val = x
         self.next = None

我正在尝试将字符串转换为linkedList

stringTotal = "abc"
head = stringToListNode(stringTotal)

#this method should return a -> b -> c 
def stringToListNode(stringTotal):
    for i in stringTotal:
        currentNode = ListNode(i)

如何获取字符串的下一个字母并使其成为下一个节点?

【问题讨论】:

  • 只需使用一个临时变量来存储最后看到的节点,并将其设置为当前节点的下一个。
  • 另外,你不是要返回第一个节点,而不是最后一个节点作为头部吗?事实上,你现在没有返回任何东西

标签: python linked-list


【解决方案1】:

试试这个:

def stringToListNode(stringTotal):
    previousNode = None
    first = None
    for i in stringTotal:
        currentNode = ListNode(i)
        if first is None:
            first = currentNode
        if previousNode is not None:
            previousNode.next = currentNode
        previousNode = currentNode
    return first

【讨论】:

  • 这是对原始函数的良好、干净(足够)的编辑,但我认为将其作为类方法总体上更干净
【解决方案2】:

这样做的一个好方法可能是在您的 ListNode 类上定义一个 from_string 类方法,它将递归地为您构建一个链表并返回头部:

class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None

    @classmethod
    def from_string(cls, s):
        if s:
            n = cls(s[0])
            n.next = ListNode.from_string(s[1:])
            return n

n = ListNode.from_string('hello')
print(n.next.next.next.next.val)
>>> 'o'

【讨论】:

    【解决方案3】:

    您可以创建一个insert 方法作为ListNode 的属性,如果next 属性已经存储了ListNode 的节点,则可以在该属性上调用该方法:

    class ListNode(object):
       def __init__(self, x=None):
         self.val = x
         self.next = None
       def insert(self, val):
         if self.val is None:
            self.val = val
         else:
            getattr(self.next, 'insert', lambda x:setattr(self, 'next', ListNode(x)))(val)
       def __str__(self):
         return '{}, {}'.format(self.val, str(self.next) if self.next else '')
       def __repr__(self):
         return 'List(<{}>)'.format(str(self))
       @classmethod
       def insert_vals(cls, s):
         l = cls()
         for i in s:
           l.insert(i)
         return l
    
    _list = ListNode.insert_vals('abc')
    print(_list)
    

    输出:

    List(<a, b, c, >)
    

    但是请注意,在方法@​​987654327@中完成的操作也可以作为一个简单的函数来执行,但是它不像实例属性那样干净:

    class ListNode(object):
      def __init__(self, x=None):
        self.val = x
        self.next = None
      def __str__(self):
        return '{}, {}'.format(self.val, str(self.next) if self.next else '')
      def __repr__(self):
        return 'List(<{}>)'.format(str(self))
    
    def insert_val(_l:ListNode, value:str) -> None:
      if _l.val is None:
        _l.val = value
      else:
        if isinstance(_l.next, ListNode):
          insert_val(_l.next, value)
        else:
          _l.next = ListNode(value)
    
    _l = ListNode()
    for i in 'abc':
      insert_val(_l, i)
    
    >>>_l
    

    输出:

    List(<a, b, c, >) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 2012-03-22
      • 1970-01-01
      • 2015-04-14
      • 2016-11-09
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多