📌  相关文章
📜  Python3程序将双向链表旋转N个节点

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

Python3程序将双向链表旋转N个节点

给定一个双向链表,将链表逆时针旋转 N 个节点。这里 N 是给定的正整数,并且小于链表中的节点数。

N = 2
轮换名单:

例子:

Input : a  b  c  d  e   N = 2
Output : c  d  e  a  b 

Input : a  b  c  d  e  f  g  h   N = 4
Output : e  f  g  h  a  b  c  d 

在亚马逊上问

要旋转双向链表,我们需要将第 N 个节点的下一个节点更改为 NULL,将最后一个节点的下一个节点更改为前一个头节点,将头节点的 prev 更改为最后一个节点,最后将 head 更改为第 (N+1) 个节点和 prev新的头节点为 NULL(双向链表中头节点的上一个为 NULL)
所以我们需要掌握三个节点:第 N 个节点、第 (N+1) 个节点和最后一个节点。从开始遍历列表并在第 N 个节点处停止。存储指向第 N 个节点的指针。我们可以使用 NthNode->next 获得第 (N+1) 个节点。继续遍历直到结束并存储指向最后一个节点的指针。最后,如上所述更改指针,并在 Last Print Rotated List 使用
打印列表函数。

Python3
# Node of a doubly linked list 
class Node: 
    def __init__(self, next = None, 
                       prev = None, data = None): 
        self.next = next # reference to next node in DLL 
        self.prev = prev # reference to previous node in DLL 
        self.data = data 
  
def push(head, new_data): 
  
    new_node = Node(data = new_data) 
  
    new_node.next = head 
    new_node.prev = None
  
    if head is not None: 
        head.prev = new_node 
  
    head = new_node
    return head
  
def printList(head):
  
    node = head
  
    print("Given linked list")
    while(node is not None): 
        print(node.data, end = " "), 
        last = node 
        node = node.next
      
def rotate(start, N):
    if N == 0 :
        return
  
    # Let us understand the below code 
    # for example N = 2 and 
    # list = a <-> b <-> c <-> d <-> e. 
    current = start 
  
    # current will either point to Nth 
    # or None after this loop. Current 
    # will point to node 'b' in the 
    # above example 
    count = 1
    while count < N and current != None :
        current = current.next
        count += 1
  
    # If current is None, N is greater 
    # than or equal to count of nodes 
    # in linked list. Don't change the 
    # list in this case 
    if current == None :
        return
  
    # current points to Nth node. Store 
    # it in a variable. NthNode points to 
    # node 'b' in the above example 
    NthNode = current 
  
    # current will point to last node 
    # after this loop current will point 
    # to node 'e' in the above example 
    while current.next != None :
        current = current.next
  
    # Change next of last node to previous 
    # head. Next of 'e' is now changed to 
    # node 'a' 
    current.next = start 
  
    # Change prev of Head node to current 
    # Prev of 'a' is now changed to node 'e' 
    start.prev = current 
  
    # Change head to (N+1)th node 
    # head is now changed to node 'c' 
    start = NthNode.next
  
    # Change prev of New Head node to None 
    # Because Prev of Head Node in Doubly 
    # linked list is None 
    start.prev = None
  
    # change next of Nth node to None 
    # next of 'b' is now None 
    NthNode.next = None
  
    return start
  
# Driver Code
if __name__ == "__main__":
    head = None
  
    head = push(head, 'e')
    head = push(head, 'd')
    head = push(head, 'c')
    head = push(head, 'b')
    head = push(head, 'a')
  
    printList(head)
    print("
")
      
    N = 2
    head = rotate(head, N)
  
    printList(head)
  
# This code is contributed by vinayak sharma


输出:
Given linked list 
a  b  c  d  e
Rotated Linked list 
c  d  e  a  b

更多详细信息请参考完整文章旋转 N 个节点的双向链表!