📜  修改链接列表的内容-递归方法

📅  最后修改于: 2021-04-22 09:45:37             🧑  作者: Mango

给定一个包含n个节点的单链列表。修改前半个节点的值,以使第一个节点的新值等于最后一个节点的值减去第一个节点的当前值,第二个节点的新值等于第二个最后一个节点的值减去第二个节点的当前值,对于前半个节点也是如此。如果n为奇数,则中间节点的值保持不变。

例子:

方法:仅对列表的后半部分使用递归遍历链接列表,而不是对整个列表进行递归,从而减少了堆栈帧。根据列表中的节点数,我们计算列表后半部分的起点,然后将列表递归到后半部分。一旦后半部分完全递归,就将堆栈中存在的节点的值与当前节点的值相减。

下面是上述方法的实现:

C++
// C++ program to modify the contents
// of the linked list with recursion
  
#include 
using namespace std;
  
// Represents a Node of the linked list
struct Node {
    int data;
    Node* next;
};
  
// Function to create and return a new node
Node* insert(int data)
{
    Node* temp;
    temp = new Node;
    temp->data = data;
    temp->next = NULL;
    return temp;
}
  
// Function which returns the total number of 
// node present in the list
int getTotalNodeCount(Node* head)
{
    int totalNodesCount = 0;
      
    while(head != NULL)
    {
        totalNodesCount++;
        head = head->next;
    }
    return totalNodesCount;
}
  
// Function to modify the contents
// of the given linked lists
void modifyContents(Node** first_half , 
                        Node* second_half) 
{
    if (second_half == NULL)
    {
        return;
    }
      
    modifyContents(first_half,second_half->next);
      
    (*first_half)->data = second_half->data - (*first_half)->data;
    (*first_half) = (*first_half)->next;
      
    return;
}
  
// Wrapper function which calculates the starting 
// point for second half of the list
void modifyContentsWrapper(Node** head)
{
    Node *ptr = NULL; // pointer to second half of list
    Node *temp = NULL; 
    int diff = 0; 
    int length = 0; // number of nodes in the list
      
    if (*head == NULL)
    {
        return;
    }
    length = getTotalNodeCount(*head);
      
    // If link list has odd number of nodes, then pointer 
    // for second half starts from (length of link list + 1).
    // Say for an example, for the list 10->4->5->3->6 pointer 
    // should start from 3.
    // If list has even number of nodes, 10->4->5->9->6->8, 
    // pointer starts from 9.
    diff = (length%2 == 0? (length/2) :(length/2)+1 );
      
    ptr = *head;
  
    while(diff--)
        ptr = ptr->next;
  
    temp = *head;
  
    modifyContents(&temp,ptr);
  
    return;
}
  
// Function to print the contents of the linked list
void print(Node* nod)
{
    if (nod == NULL) {
        return;
    }
      
    cout << nod->data;
      
    if (nod->next != NULL)
        cout << " -> ";
      
    print(nod->next);
}
  
// Driver code
int main()
{
    Node* head = insert(2);
    head->next = insert(9);
    head->next->next = insert(8);
    head->next->next->next = insert(12);
    head->next->next->next->next = insert(7);
    head->next->next->next->next->next = insert(10);
      
    // Modify the linked list
    modifyContentsWrapper(&head);
  
    // Print the modified linked list
    print(head);
      
    return 0;
}


Java
// Java program to modify the contents
// of the linked list with recursion
class GFG
{
  
// Represents a Node of the linked list
static class Node 
{
    int data;
    Node next;
};
  
// Function to create and return a new node
static Node insert(int data)
{
    Node temp;
    temp = new Node();
    temp.data = data;
    temp.next = null;
    return temp;
}
  
// Function which returns the total number 
// of node present in the list
static int getTotalNodeCount(Node head)
{
    int totalNodesCount = 0;
      
    while(head != null)
    {
        totalNodesCount++;
        head = head.next;
    }
    return totalNodesCount;
}
  
static Node temp = null;
  
// Function to modify the contents
// of the given linked lists
static void modifyContents(Node second_half) 
{
    if (second_half == null)
    {
        return;
    }
      
    modifyContents(second_half.next);
      
    (temp).data = second_half.data - (temp).data;
    (temp) = (temp).next;
      
    return;
}
  
// Wrapper function which calculates the starting 
// point for second half of the list
static Node modifyContentsWrapper(Node head)
{
    Node ptr = null; // pointer to second half of list
    temp = null; 
    int diff = 0; 
    int length = 0; // number of nodes in the list
      
    if (head == null)
    {
        return null;
    }
    length = getTotalNodeCount(head);
      
    // If link list has odd number of nodes, 
    // then pointer for second half starts 
    // from (length of link list + 1). 
    // Say for an example, for the list 10.4.5.3.6  
    // pointer should start from 3.
    // If list has even number of nodes, 
    // 10.4.5.9.6.8, pointer starts from 9.
    diff = (length % 2 == 0 ? 
               (length / 2) : (length / 2) + 1);
      
    ptr = head;
  
    while(diff-->0)
        ptr = ptr.next;
  
    temp = head;
  
    modifyContents(ptr);
  
    return head;
}
  
// Function to print the contents
// of the linked list
static void print(Node nod)
{
    if (nod == null)
    {
        return;
    }
      
    System.out.print( nod.data);
      
    if (nod.next != null)
        System.out.print( " -> ");
      
    print(nod.next);
}
  
// Driver code
public static void main(String args[])
{
    Node head = insert(2);
    head.next = insert(9);
    head.next.next = insert(8);
    head.next.next.next = insert(12);
    head.next.next.next.next = insert(7);
    head.next.next.next.next.next = insert(10);
      
    // Modify the linked list
    head = modifyContentsWrapper(head);
  
    // Print the modified linked list
    print(head);
}
}
  
// This code is contributed by Arnab Kundu


Python
# Python program to modify the contents 
# of the linked list with recursion 
  
# Represents a Node of the linked list 
class Node: 
      
    def __init__(self, data): 
        self.data = data 
        self.next = None
  
# Function to create and return a new node 
def insert( data) :
  
    temp = Node(0) 
    temp.data = data 
    temp.next = None
    return temp 
  
# Function which returns the total number 
# of node present in the list 
def getTotalNodeCount( head) :
  
    totalNodesCount = 0
      
    while(head != None): 
      
        totalNodesCount = totalNodesCount + 1
        head = head.next
      
    return totalNodesCount 
  
temp = None
  
# Function to modify the contents 
# of the given linked lists 
def modifyContents( second_half) :
  
    if (second_half == None): 
        return
    global temp
      
    modifyContents(second_half.next) 
      
    (temp).data = second_half.data - (temp).data 
    (temp) = (temp).next
    return
  
# Wrapper function which calculates the starting 
# point for second half of the list 
def modifyContentsWrapper(head) :
      
    # pointer to second half of list 
    ptr = None
    diff = 0
  
    # number of nodes in the list 
    length = 0
    global temp
    temp = None
      
    if (head == None) :
        return None
      
    length = getTotalNodeCount(head) 
      
    # If link list has odd number of nodes, 
    # then pointer for second half starts 
    # from (length of link list + 1). 
    # Say for an example, for the list 10.4.5.3.6 
    # pointer should start from 3. 
    # If list has even number of nodes, 
    # 10.4.5.9.6.8, pointer starts from 9. 
    if(length % 2 == 0): 
        diff = (length / 2) 
    else:
        diff = (length / 2) + 1
      
    ptr = head 
  
    while(diff > 0):
        diff = diff - 1
        ptr = ptr.next
  
    temp = head 
    modifyContents(ptr) 
    return head 
  
# Function to print the contents 
# of the linked list 
def print_(nod): 
  
    if (nod == None) :
        return
      
    print(nod.data, end = " ")
      
    if (nod.next != None): 
        print( " -> ",end = "") 
      
    print_(nod.next) 
  
# Driver code 
head = insert(2) 
head.next = insert(9) 
head.next.next = insert(8) 
head.next.next.next = insert(12) 
head.next.next.next.next = insert(7) 
head.next.next.next.next.next = insert(10) 
      
# Modify the linked list 
head = modifyContentsWrapper(head) 
  
# Print the modified linked list 
print_(head) 
  
# This code is contributed by Arnab Kundu


C#
// C# program to modify the contents
// of the linked list with recursion
using System;
      
class GFG
{
  
// Represents a Node of the linked list
public class Node 
{
    public int data;
    public Node next;
};
  
// Function to create and return a new node
static Node insert(int data)
{
    Node temp;
    temp = new Node();
    temp.data = data;
    temp.next = null;
    return temp;
}
  
// Function which returns the total number 
// of node present in the list
static int getTotalNodeCount(Node head)
{
    int totalNodesCount = 0;
      
    while(head != null)
    {
        totalNodesCount++;
        head = head.next;
    }
    return totalNodesCount;
}
  
static Node temp = null;
  
// Function to modify the contents
// of the given linked lists
static void modifyContents(Node second_half) 
{
    if (second_half == null)
    {
        return;
    }
      
    modifyContents(second_half.next);
      
    (temp).data = second_half.data - (temp).data;
    (temp) = (temp).next;
      
    return;
}
  
// Wrapper function which calculates the starting 
// point for second half of the list
static Node modifyContentsWrapper(Node head)
{
    // pointer to second half of list
    Node ptr = null; 
    temp = null; 
    int diff = 0; 
      
    // number of nodes in the list
    int length = 0; 
      
    if (head == null)
    {
        return null;
    }
    length = getTotalNodeCount(head);
      
    // If link list has odd number of nodes, 
    // then pointer for second half starts 
    // from (length of link list + 1). 
    // Say for an example, for the list 10.4.5.3.6 
    // pointer should start from 3.
    // If list has even number of nodes, 
    // 10.4.5.9.6.8, pointer starts from 9.
    diff = (length % 2 == 0 ? 
           (length / 2) : (length / 2) + 1);
      
    ptr = head;
  
    while(diff-->0)
        ptr = ptr.next;
  
    temp = head;
  
    modifyContents(ptr);
  
    return head;
}
  
// Function to print the contents
// of the linked list
static void print(Node nod)
{
    if (nod == null)
    {
        return;
    }
      
    Console.Write(nod.data);
      
    if (nod.next != null)
        Console.Write(" -> ");
      
    print(nod.next);
}
  
// Driver code
public static void Main(String []args)
{
    Node head = insert(2);
    head.next = insert(9);
    head.next.next = insert(8);
    head.next.next.next = insert(12);
    head.next.next.next.next = insert(7);
    head.next.next.next.next.next = insert(10);
      
    // Modify the linked list
    head = modifyContentsWrapper(head);
  
    // Print the modified linked list
    print(head);
}
}
  
// This code is contributed by PrinciRaj1992


输出:
8 -> -2 -> 4 -> 12 -> 7 -> 10