用于旋转链表的Python程序
给定一个单链表,将链表逆时针旋转 k 个节点。其中 k 是给定的正整数。例如,如果给定的链表是 10->20->30->40->50->60,k 为 4,则链表应修改为 50->60->10->20->30- >40。假设 k 小于链表中的节点数。
方法一:
要旋转链表,我们需要将第 k 个节点的 next 更改为 NULL,将最后一个节点的 next 更改为前一个 head 节点,最后将 head 更改为第 (k+1) 个节点。所以我们需要掌握三个节点:第k个节点、第(k+1)个节点和最后一个节点。
从头开始遍历列表并在第 k 个节点处停止。存储指向第 k 个节点的指针。我们可以使用 kthNode->next 获得第 (k+1) 个节点。继续遍历直到结束并存储指向最后一个节点的指针。最后,如上所述更改指针。
下图显示了如何在代码中使用旋转函数:
Python
# Python program to rotate
# a linked list
# Node class
class Node:
# Constructor to initialize
# the node object
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
# Function to initialize head
def __init__(self):
self.head = None
# Function to insert a new node
# at the beginning
def push(self, new_data):
# allocate node and put the data
new_node = Node(new_data)
# Make next of new node as head
new_node.next = self.head
# Move the head to point to the
# new Node
self.head = new_node
# Utility function to print it the
# linked LinkedList
def printList(self):
temp = self.head
while(temp):
print temp.data,
temp = temp.next
# This function rotates a linked list
# counter-clockwise and updates the
# head. The function assumes that k
# is smaller than size of linked list.
# It doesn't modify the list if k is
# greater than of equal to size
def rotate(self, k):
if k == 0:
return
# Let us understand the below code
# for example k = 4 and list =
# 10->20->30->40->50->60
current = self.head
# current will either point to kth
# or NULL after this loop current
# will point to node 40 in the above
# example
count = 1
while(count 20->30->40->50->60
for i in range(60, 0, -10):
llist.push(i)
print "Given linked list"
llist.printList()
llist.rotate(4)
print "Rotated Linked list"
llist.printList()
# This code is contributed by Nikhil Kumar Singh(nickzuck_007)
Python3
# Python3 program to rotate a
# linked list counter clock wise
# Link list node
class Node:
def __init__(self):
self.data = 0
self.next = None
# This function rotates a linked list
# counter-clockwise and updates the
# head. The function assumes that k is
# smaller than size of linked list.
def rotate(head_ref, k):
if (k == 0):
return
# Let us understand the below
# code for example k = 4 and
# list = 10.20.30.40.50.60.
current = head_ref
# Traverse till the end.
while (current.next != None):
current = current.next
current.next = head_ref
current = head_ref
# Traverse the linked list to k-1
# position which will be last
# element for rotated array.
for i in range(k - 1):
current = current.next
# Update the head_ref and last
# element pointer to None
head_ref = current.next
current.next = None
return head_ref
# UTILITY FUNCTIONS
# Function to push a node
def push(head_ref, new_data):
# Allocate node
new_node = Node()
# Put in the data
new_node.data = new_data
# Link the old list off
# the new node
new_node.next = (head_ref)
# Move the head to point
# to the new node
(head_ref) = new_node
return head_ref
# Function to print linked list
def printList(node):
while (node != None):
print(node.data, end = ' ')
node = node.next
# Driver code
if __name__=='__main__':
# Start with the empty list
head = None
# Create a list
# 10.20.30.40.50.60
for i in range(60, 0, -10):
head = push(head, i)
print("Given linked list ")
printList(head)
head = rotate(head, 4)
print("\nRotated Linked list ")
printList(head)
# This code is contributed by rutvik_56
Output:Given linked list
10 20 30 40 50 60
Rotated Linked list
50 60 10 20 30 40Please refer complete article on Rotate a Linked List for more details!
p>输出:
Given linked list
10 20 30 40 50 60
Rotated Linked list
50 60 10 20 30 40
方法二:
要将链表旋转k,我们可以先使链表循环,然后从头节点向前移动k-1步,使第(k-1)个节点的next为空,并以第k个节点为头。
Python3
# Python3 program to rotate a
# linked list counter clock wise
# Link list node
class Node:
def __init__(self):
self.data = 0
self.next = None
# This function rotates a linked list
# counter-clockwise and updates the
# head. The function assumes that k is
# smaller than size of linked list.
def rotate(head_ref, k):
if (k == 0):
return
# Let us understand the below
# code for example k = 4 and
# list = 10.20.30.40.50.60.
current = head_ref
# Traverse till the end.
while (current.next != None):
current = current.next
current.next = head_ref
current = head_ref
# Traverse the linked list to k-1
# position which will be last
# element for rotated array.
for i in range(k - 1):
current = current.next
# Update the head_ref and last
# element pointer to None
head_ref = current.next
current.next = None
return head_ref
# UTILITY FUNCTIONS
# Function to push a node
def push(head_ref, new_data):
# Allocate node
new_node = Node()
# Put in the data
new_node.data = new_data
# Link the old list off
# the new node
new_node.next = (head_ref)
# Move the head to point
# to the new node
(head_ref) = new_node
return head_ref
# Function to print linked list
def printList(node):
while (node != None):
print(node.data, end = ' ')
node = node.next
# Driver code
if __name__=='__main__':
# Start with the empty list
head = None
# Create a list
# 10.20.30.40.50.60
for i in range(60, 0, -10):
head = push(head, i)
print("Given linked list ")
printList(head)
head = rotate(head, 4)
print("\nRotated Linked list ")
printList(head)
# This code is contributed by rutvik_56
输出:
Given linked list
10 20 30 40 50 60
Rotated Linked list
50 60 10 20 30 40
有关详细信息,请参阅有关旋转链接列表的完整文章!
在评论中写代码?请使用 ide.geeksforgeeks.org,生成链接并在此处分享链接。