简体   繁体   English

如何递归地将节点添加到链表?

[英]How to recursively add a node to a linked list?

I created a function that inserts a node to its correct position.我创建了一个 function,它将一个节点插入到其正确的 position。

For example:例如:

root = converts_list_to_linked_list([4, 7, 9, 14]) #I have a linked list: 4->7->9->14 root = converts_list_to_linked_list([4, 7, 9, 14]) #我有一个链表:4->7->9->14

The Function: Function:

insert_ordered(root, 12)插入排序(根,12)

returns a linked list of "4->7->9->12->14->None"返回“4->7->9->12->14->None”的链表

class LN:
def __init__(self, value):
    self.value = value
    self.next = None

def insert_ordered(root, data):
    node = LN(data)
    if root == None:
        return node
    else:
    if root.value > data:
        node.next = root
        return node
    else:
        temp, prev = root, None
        while temp.next and temp.value <= data:
            prev = temp
            temp = temp.next

        if temp.next == None and temp.value <= data:
            temp.next = node
        else:
            node.next = prev.next
            prev.next = node

        return root

Is there any way to solve this problem recursively?有没有办法递归地解决这个问题? I can't grasp the idea on how too.我也无法理解如何做。

Try this:尝试这个:

class LN:
    def __init__(self, value, node=None):
        self.value = value
        self.next = node

def insert_ordered(root, data):

    if root == None or root.value > data:
        return LN(data, root)

    root.next = insert_ordered(root.next, data)
    return root

If you want to insert in descending order change root.value > data to root.value < data如果要按降序插入,请将root.value > data更改为root.value < data

The following uses an auxiliary function to recursively insert into the list:下面使用一个辅助的 function 递归地插入到列表中:

class LN:
  def __init__(self, value):
      self.value = value
      self.next = None

  def insert_ordered(self, data):
      node = LN(data)
      return self.insert_ordered_aux(node)

  def insert_ordered_aux(self,node):
      if self.value >= node.value: # add node before current node
          node.next = self
          return node
      elif self.next: # do the recursion
        self.next =  self.next.insert_ordered_aux(node)
        return self
      else: # add node at end of list
        self.next = node
        return self


#test:
root = LN(4)
root = root.insert_ordered(9)
root = root.insert_ordered(14)
root = root.insert_ordered(6)
root = root.insert_ordered(-2)
root = root.insert_ordered(12)

def print_list(node):
  if (node):
    print(node.value)
    print_list(node.next)

print_list(root)

How are you using it, and is your pasted code's indentation correct?你是如何使用它的,你粘贴的代码的缩进是否正确?

After some indentation adjustments, this is how i use it, and what i get:经过一些缩进调整,这就是我使用它的方式,以及我得到的:

class LN:
        def __init__(self, value):
            self.value = value
            self.next = None

        def insert_ordered(root, data):
            node = LN(data)
            if root == None:
                return node
            else:
                if root.value > data:
                    node.next = root
                    return node
                else:
                    temp, prev = root, None
                    while temp.next and temp.value <= data:
                        prev = temp
                        temp = temp.next

                    if temp.next == None and temp.value <= data:
                        temp.next = node
                    else:
                        node.next = prev.next
                        prev.next = node

                    return root

#Use:

a1 = LN(1)
a1.next = a2 = LN(5)
a2.next = a3 = LN(10)
a3.next = a4 = LN(15)

root = a1

#Insert tests
root = root.insert_ordered(13)
root = root.insert_ordered(12)
root = root.insert_ordered(15)
root = root.insert_ordered(-5)
root = root.insert_ordered(17)

t = root
while(t):
    print(str(t.value) + " ")
    t = t.next

Output: -5 1 5 10 12 13 15 15 17 Output:-5 1 5 10 12 13 15 15 17

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM