📜  反转链表的子列表

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

反转链表的子列表

我们得到一个链表和位置 m 和 n。我们需要将链表从位置 m 反转到 n。

例子:

Input : 10->20->30->40->50->60->70->NULL
        m = 3, n = 6
Output : 10->20->60->50->40->30->70->NULL

Input :  1->2->3->4->5->6->NULL 
         m = 2, n = 4
Output : 1->4->3->2->5->6->NULL

为了将链表从位置 m 反转到 n,我们通过运行循环找到链表的开始和结束位置的地址,然后我们将这部分与链表的其余部分取消链接,然后使用正常的链表反转函数前面我们用过反转完整链表,用它来反转链表中需要反转的部分。反转后,我们再次将反转的部分附加到主列表中。

C++
// C++ program to reverse a linked list
// from position m to position n
#include 
#include 
 
// Linked list node
struct Node {
    int data;
    struct Node* next;
};
 
// the standard reverse function used
// to reverse a linked list
struct Node* reverse(struct Node* head)
{
    struct Node* prev = NULL;   
    struct Node* curr = head;
 
    while (curr) {
        struct Node* next = curr->next;
        curr->next = prev;
        prev = curr;
        curr = next;
    }
    return prev;
}
 
// function used to reverse a linked list
// from position m to n which uses reverse
// function
Node* reverseBetween(Node* head, int m, int n)
{
    if (m == n)
        return head;
 
    // revs and revend is start and end respectively
    // of the portion of the linked list which
    // need to be reversed. revs_prev is previous
    // of starting position and revend_next is next
    // of end of list to be reversed.
    Node* revs = NULL, *revs_prev = NULL;
    Node* revend = NULL, *revend_next = NULL;
 
    // Find values of above pointers.
    int i = 1;
    Node* curr = head;
    while (curr && i <= n) {
        if (i < m)
            revs_prev = curr;
 
        if (i == m)
            revs = curr;
 
        if (i == n) {
            revend = curr;
            revend_next = curr->next;
        }
 
        curr = curr->next;
        i++;
    }
    revend->next = NULL;
 
    // Reverse linked list starting with
    // revs.
    revend = reverse(revs);
 
    // If starting position was not head
    if (revs_prev)
        revs_prev->next = revend;
 
    // If starting position was head
    else
        head = revend;
 
    revs->next = revend_next;
    return head;
}
 
void print(struct Node* head)
{
    while (head != NULL) {
        printf("%d ", head->data);
        head = head->next;
    }
    printf("\n");
}
 
// function to add a new node at the
// beginning of the list
void push(struct Node** head_ref, int new_data)
{
    struct Node* new_node = new Node;
    new_node->data = new_data;
    new_node->next = (*head_ref);
    (*head_ref) = new_node;
}
 
// Driver code
int main()
{
    struct Node* head = NULL;
    push(&head, 70);
    push(&head, 60);
    push(&head, 50);
    push(&head, 40);
    push(&head, 30);
    push(&head, 20);
    push(&head, 10);
    reverseBetween(head, 3, 6);
    print(head);
    return 0;
}


Python3
# Python3 program to reverse a linked list
# from position m to position n
  
# Linked list node
class Node:
     
    def __init__(self, data):
         
        self.data = data
        self.next = None
 
# The standard reverse function used
# to reverse a linked list
def reverse(head):
 
    prev = None  
    curr = head
  
    while (curr):
        next = curr.next
        curr.next = prev
        prev = curr
        curr = next
     
    return prev
  
# Function used to reverse a linked list
# from position m to n which uses reverse
# function
def reverseBetween(head, m, n):
 
    if (m == n):
        return head
         
    # revs and revend is start and end respectively
    # of the portion of the linked list which
    # need to be reversed. revs_prev is previous
    # of starting position and revend_next is next
    # of end of list to be reversed.
    revs = None
    revs_prev = None
    revend = None
    revend_next = None
  
    # Find values of above pointers.
    i = 1
    curr = head
     
    while (curr and i <= n):
        if (i < m):
            revs_prev = curr
  
        if (i == m):
            revs = curr
  
        if (i == n):
            revend = curr
            revend_next = curr.next
  
        curr = curr.next
        i += 1
 
    revend.next = None
  
    # Reverse linked list starting with
    # revs.
    revend = reverse(revs)
  
    # If starting position was not head
    if (revs_prev):
        revs_prev.next = revend
  
    # If starting position was head
    else:
        head = revend
  
    revs.next = revend_next
    return head
 
def prints(head):
 
    while (head != None):
        print(head.data, end = ' ')
        head = head.next
         
    print()
 
# Function to add a new node at the
# beginning of the list
def push(head_ref, new_data):
 
    new_node = Node(new_data)
    new_node.data = new_data
    new_node.next = (head_ref)
    (head_ref) = new_node
    return head_ref
 
# Driver code
if __name__=='__main__':
     
    head = None
    head = push(head, 70)
    head = push(head, 60)
    head = push(head, 50)
    head = push(head, 40)
    head = push(head, 30)
    head = push(head, 20)
    head = push(head, 10)
     
    reverseBetween(head, 3, 6)
     
    prints(head)
     
# This code is contributed by rutvik_56


输出:

10 20 60 50 40 30 70

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程