📌  相关文章
📜  用于在链表中间插入节点的Python程序

📅  最后修改于: 2022-05-13 01:57:44.564000             🧑  作者: Mango

用于在链表中间插入节点的Python程序

给定一个包含n 个节点的链表。问题是在列表中间插入一个带有数据x的新节点。如果n是偶数,则在第(n/2)个节点之后插入新节点,否则在第(n+1)/2个节点之后插入新节点。

例子:

Input : list: 1->2->4->5
        x = 3
Output : 1->2->3->4->5

Input : list: 5->10->4->32->16
        x = 41
Output : 5->10->4->41->32->16

方法一(使用链表的长度):
使用一次遍历查找链接的节点数或长度。让它成为len 。计算c = (len/2),如果len是偶数,否则c = (len+1)/2,如果len是奇数。再次遍历前c个节点,在第c个节点之后插入新节点。

Python3
# Python3 implementation to insert node
# at the middle of a linked list
  
# Node class
class Node:
  
    # constructor to create a new node
    def __init__(self, data):
        self.data = data
        self.next = None
  
# function to insert node at the
# middle of linked list given the head
def insertAtMid(head, x):
  
    if(head == None): #if the list is empty
        head = Node(x)
    else:
          
        # create a new node for the value
        # to be inserted
        newNode = Node(x)
  
        ptr = head
        length = 0
          
        # calculate the length of the linked
        # list
        while(ptr != None):
            ptr = ptr.next
            length += 1
  
        # 'count' the number of node after which
        # the new node has to be inserted
        if(length % 2 == 0):
            count = length / 2 
        else:
            (length + 1) / 2
  
        ptr = head
  
        # move ptr to the node after which
        # the new node has to inserted
        while(count > 1):
            count -= 1
            ptr = ptr.next
  
        # insert the 'newNode' and adjust
        # links accordingly
        newNode.next = ptr.next
        ptr.next = newNode
  
# function to display the linked list
def display(head):
    temp = head
    while(temp != None):
        print(str(temp.data), end = " ")
        temp = temp.next
  
# Driver Code
  
# Creating the linked list 1.2.4.5
head = Node(1)
head.next = Node(2)
head.next.next = Node(4)
head.next.next.next = Node(5)
  
print("Linked list before insertion: ", end = "")
display(head)
  
# inserting 3 in the middle of the linked list.
x = 3
insertAtMid(head, x)
  
print("
Linked list after insertion: " , end = "")
display(head)
  
# This code is contributed by Pranav Devarakonda


Python3
# Python implementation to insert node 
# at the middle of the linked list 
  
# Node Class
class Node :
    def __init__(self, d):
        self.data = d 
        self.next = None
          
class LinkedList: 
  
    # function to insert node at the 
    # middle of the linked list
    def __init__(self):
        self.head = None
      
    # Function to insert a new node 
    # at the beginning 
    def push(self, new_data): 
        new_node = Node(new_data) 
        new_node.next = self.head 
        self.head = new_node 
          
    def insertAtMid(self, x):
          
        # if list is empty 
        if (self.head == None): 
            self.head = Node(x) 
  
        else: 
              
            # get a new node 
            newNode = Node(x) 
  
            # assign values to the slow 
            # and fast pointers 
            slow = self.head
            fast = self.head.next
  
            while (fast != None and 
                   fast.next != None): 
                  
                # move slow pointer to next node 
                slow = slow.next
  
                # move fast pointer two nodes 
                # at a time 
                fast = fast.next.next
  
            # insert the 'newNode' and 
            # adjust the required links 
            newNode.next = slow.next
            slow.next = newNode
  
    # function to display the linked list 
    def display(self):
        temp = self.head 
        while (temp != None): 
            print(temp.data, end = " "),
            temp = temp.next
  
# Driver Code
  
# Creating the list 1.2.4.5 
ll = LinkedList()
ll.push(5)
ll.push(4)
ll.push(2)
ll.push(1)
print("Linked list before insertion: "),
ll.display()
  
x = 3
ll.insertAtMid(x)
  
print("
Linked list after insertion: "),
ll.display()
  
# This code is contributed by prerna saini


输出:

Linked list before insertion: 1 2 4 5
Linked list after insertion: 1 2 3 4 5

时间复杂度: O(n)

方法2(使用两个指针):
基于使用两个指针的龟兔算法,一个称为指针,另一个称为指针。该算法有助于找到链表的中间节点。在这篇文章的正面和黑色分裂过程中进行了解释。现在,您可以在通过上述过程获得的中间节点之后插入新节点。这种方法只需要一次遍历列表。

Python3

# Python implementation to insert node 
# at the middle of the linked list 
  
# Node Class
class Node :
    def __init__(self, d):
        self.data = d 
        self.next = None
          
class LinkedList: 
  
    # function to insert node at the 
    # middle of the linked list
    def __init__(self):
        self.head = None
      
    # Function to insert a new node 
    # at the beginning 
    def push(self, new_data): 
        new_node = Node(new_data) 
        new_node.next = self.head 
        self.head = new_node 
          
    def insertAtMid(self, x):
          
        # if list is empty 
        if (self.head == None): 
            self.head = Node(x) 
  
        else: 
              
            # get a new node 
            newNode = Node(x) 
  
            # assign values to the slow 
            # and fast pointers 
            slow = self.head
            fast = self.head.next
  
            while (fast != None and 
                   fast.next != None): 
                  
                # move slow pointer to next node 
                slow = slow.next
  
                # move fast pointer two nodes 
                # at a time 
                fast = fast.next.next
  
            # insert the 'newNode' and 
            # adjust the required links 
            newNode.next = slow.next
            slow.next = newNode
  
    # function to display the linked list 
    def display(self):
        temp = self.head 
        while (temp != None): 
            print(temp.data, end = " "),
            temp = temp.next
  
# Driver Code
  
# Creating the list 1.2.4.5 
ll = LinkedList()
ll.push(5)
ll.push(4)
ll.push(2)
ll.push(1)
print("Linked list before insertion: "),
ll.display()
  
x = 3
ll.insertAtMid(x)
  
print("
Linked list after insertion: "),
ll.display()
  
# This code is contributed by prerna saini

输出:

Linked list before insertion: 1 2 4 5
Linked list after insertion: 1 2 3 4 5

时间复杂度: O(n)

详情请参考完整文章将节点插入链表中间!