用于在链表中间插入节点的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)
详情请参考完整文章将节点插入链表中间!