📜  双元素并在链表中附加零

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

双元素并在链表中附加零

给定一个链表,在零之前有两个相邻的重复节点,任务是将第一个加倍并使下一个为 0。在此之后,将所有零附加到尾部。
先决条件:单向链表的实现基础

例子 :

Input : 4 -> 4 -> 0 -> 2 -> 3 -> 4 -> 
        3 -> 3 -> 0 -> 4 -> 
Output : 8-> 2-> 3-> 4-> 6-> 4-> 0-> 
         0-> 0-> 0-> 

Explanation :
First, after doubling the first element and making
second element 0 before all zeros.
8 -> 0 -> 0 -> 2 -> 3 -> 4 -> 6 -> 0 
-> 0 -> 4 ->
Next :
8 -> 6 -> 5 -> 6 -> 0 -> 0 -> 0 -> 
0 -> 0 -> 0 -> 0 -> 

Input : 0 -> 4 -> 4 -> 0 -> 3 -> 3 -> 0 
        -> 5 -> 0 -> 0 -> 6 ->
Output : 8 -> 6 -> 5 -> 6 -> 0 -> 0 -> 0 
         -> 0 -> 0 -> 0 -> 0 ->

遍历链表,只要有两个相邻的相同节点数据在一个0之前(例如4 -> 4 -> 0),那么,将第一个元素加倍,使另一个为0(例如8 -> 0 -> 0 - >)。最后,遍历链表并线性地将所有零指向尾部。

Java
// Java code to modify linked list
import java.util.*;
 
// Linked List Node
class Node {
    int data;
    Node next;
 
    // Constructor
    public Node(int data)
    {
        this.data = data;
        next = null;
    }
}
 
// Class ro perform operations
// on linked list
class GfG {
    // Recursive function to double the one of two
    // elements and make next one as 0,
    // which are equal before 0
    public static void changeTwoBefore0(Node head)
    {
        // there should be atleast three elements
        // to perform required operation
        if (head == null || head.next == null
            || head.next.next == null)
            return;
 
        // when two continuous elements
        // are same
        if ((head.data == head.next.data)
            && (head.next.next.data == 0)) {
 
            int temp = head.data;
            head.data = 2 * temp;
            head.next.data = 0;
 
            if (head.next.next.next != null)
                head = head.next.next.next;
            else
                return;
        }
        else
            head = head.next;
 
        // recursive call to changeTwoBefore0
        // for next element
        changeTwoBefore0(head);
    }
 
    // function to append zeros at tail
    public static Node appendZero(Node head)
    {
        if (head == null || head.next == null)
            return head;
 
        // Find tail node
        Node tail = head;
        while (tail.next != null)
            tail = tail.next;
        Node origTail = tail;
 
        // Case when starting nodes have 0 values
        // we need to change head in this case.
        Node curr = head;
        while (curr.next != null && curr.data == 0) {
            tail.next = curr;
            tail = curr;
            curr = curr.next;
        }
        head = curr;
 
        // Now moving other 0s to end
        Node prev = curr;
        curr = curr.next;
 
        // We check until original tail
        while (curr != origTail) {
            // If current data is 0, append
            // after tail and update tail.
            if (curr.data == 0) {
                tail.next = curr;
                tail = curr;
                prev.next = curr.next;
            }
            else
                prev = curr;
 
            // We always move current
            curr = curr.next;
        }
 
        // Finally making sure that linked
        // list is null terminated.
        tail.next = null;
 
        return head;
    }
 
    public static Node doubleAndAppend0(Node head)
    {
        // Change two same nodes before 0
        changeTwoBefore0(head);
 
        // Move all 0s to end
        return appendZero(head);
    }
 
    // function to display the nodes
    public static void display(Node head)
    {
        while (head != null) {
            System.out.print(head.data + " -> ");
            head = head.next;
        }
    }
 
    // Driver code
    public static void main(String[] args)
    {
 
        Node head = new Node(4);
        head.next = new Node(4);
        head.next.next = new Node(0);
        head.next.next.next = new Node(2);
        head.next.next.next.next = new Node(3);
        head.next.next.next.next.next = new Node(4);
        head.next.next.next.next.next.next = new Node(3);
        head.next.next.next.next.next.next.next
            = new Node(3);
        head.next.next.next.next.next.next.next.next
            = new Node(0);
        head.next.next.next.next.next.next.next.next.next
            = new Node(4);
 
        System.out.println("Original linked list :");
        display(head);
 
        head = doubleAndAppend0(head);
 
        System.out.println("\nModified linked list :");
        display(head);
    }
}


C++
// C++ code to modify linked list
#include 
using namespace std;
 
// Linked List Node
class Node {
public:
    int data;
    Node* next;
 
    // Constructor
public:
    Node(int dat)
    {
        data = dat;
        next = NULL;
    }
};
 
// Recursive function to double the one of two
// elements and make next one as 0,
// which are equal before 0
void changeTwoBefore0(Node* head)
{
    // there should be atleast three elements
    // to perform required operation
    if (head == NULL || head->next == NULL
        || head->next->next == NULL)
        return;
 
    // when two continuous elements
    // are same
    if ((head->data == head->next->data)
        && (head->next->next->data == 0))
    {
 
        int temp = head->data;
        head->data = 2 * temp;
        head->next->data = 0;
 
        if (head->next->next->next != NULL)
            head = head->next->next->next;
        else
            return;
    }
    else
        head = head->next;
 
    // recursive call to changeTwoBefore0
    // for next element
    changeTwoBefore0(head);
}
// function to append zeros at tail
Node* appendZero(Node* head)
{
    if (head == NULL || head->next == NULL)
        return head;
 
    // Find tail node
    Node* tail = head;
    while (tail->next != NULL)
        tail = tail->next;
    Node* origTail = tail;
 
    // Case when starting nodes have 0 values
    // we need to change head in this case.
    Node* curr = head;
    while (curr->next != NULL && curr->data == 0)
    {
        tail->next = curr;
        tail = curr;
        curr = curr->next;
    }
    head = curr;
 
    // Now moving other 0s to end
    Node* prev = curr;
    curr = curr->next;
 
    // We check until original tail
    while (curr != origTail)
    {
        // If current data is 0, append
        // after tail and update tail.
        if (curr->data == 0)
        {
            tail->next = curr;
            tail = curr;
            prev->next = curr->next;
        }
        else
            prev = curr;
 
        // We always move current
        curr = curr->next;
    }
 
    // Finally making sure that linked
    // list is NULL terminated.
    tail->next = NULL;
 
    return head;
}
 
Node* doubleAndAppend0(Node* head)
{
    // Change two same nodes before 0
    changeTwoBefore0(head);
 
    // Move all 0s to end
    return appendZero(head);
}
 
// function to display the nodes
void display(Node* head)
{
    while (head != NULL) {
        cout << head->data << " -> ";
        head = head->next;
    }
}
 
// Driver Code
int main()
{
    Node* head = new Node(4);
    head->next = new Node(4);
    head->next->next = new Node(0);
    head->next->next->next = new Node(2);
    head->next->next->next->next = new Node(3);
    head->next->next->next->next->next = new Node(4);
    head->next->next->next->next->next->next = new Node(3);
    head->next->next->next->next->next->next->next
        = new Node(3);
    head->next->next->next->next->next->next->next->next
        = new Node(0);
    head->next->next->next->next->next->next->next->next
        ->next
        = new Node(4);
 
    cout << "Original linked list :";
    display(head);
 
    head = doubleAndAppend0(head);
 
    cout << "\nModified linked list :";
    display(head);
    return 0;
}
 
// contributed by ajaykr00kj


Python3
# Python3 code to modify linked list
 
# Linked List Node
class Node:
 
    # Constructor
    def __init__(self, data):
     
        self.data = data
        self.next = None
     
# Recursive function to double the one of two
# elements and make next one as 0,
# which are equal before 0
def changeTwoBefore0 (head):
     
    # there should be atleast three elements
    # to perform required operation
    if (head == None or head.next == None or head.next.next == None):
        return
 
    # when two continuous elements
    # are same
    if ((head.data == head.next.data) and (head.next.next.data == 0)):
 
        temp = head.data
        head.data = 2*temp
        head.next.data = 0
 
        if (head.next.next.next != None):
            head = head.next.next.next
        else:
            return
         
    else:
        head = head.next
 
    # recursive call to changeTwoBefore0
    # for next element
    changeTwoBefore0(head)
     
# function to append zeros at tail
def appendZero( head):
     
    if (head == None or head.next == None):
        return head
 
    # Find tail node
    tail = head
    while (tail.next != None):
        tail = tail.next
    origTail = tail
 
    # Case when starting nodes have 0 values
    # we need to change head in this case.
    curr = head
    while (curr.next != None and curr.data == 0):
         
        tail.next = curr
        tail = curr
        curr = curr.next
         
    head = curr
 
    # Now moving other 0s to end
    prev = curr
    curr = curr.next
     
    # We check until original tail
    while (curr != origTail):
         
        # If current data is 0, append
        # after tail and update tail.
        if (curr.data == 0):
             
            tail.next = curr
            tail = curr
            prev.next = curr.next
             
        else:
            prev = curr
                 
        # We always move current    
        curr = curr.next
         
    # Finally making sure that linked
    # list is None terminated.
    tail.next = None
 
    return head
     
def doubleAndAppend0(head):
     
    # Change two same nodes before 0
    changeTwoBefore0(head)
         
    # Move all 0s to end
    return appendZero(head)
     
# function to display the nodes
def display( head):
     
    while (head != None):
         
        print(head.data ,end = " -> ")
        head = head.next
 
# Driver code
 
head = Node(4)
head.next = Node(4)
head.next.next = Node(0)
head.next.next.next = Node(2)
head.next.next.next.next = Node(3)
head.next.next.next.next.next = Node(4)
head.next.next.next.next.next.next = Node(3)
head.next.next.next.next.next.next.next = Node(3)
head.next.next.next.next.next.next.next.next = Node(0)
head.next.next.next.next.next.next.next.next.next = Node(4)
 
print("Original linked list :")
display(head)
     
head = doubleAndAppend0(head)
 
print("\nModified linked list :")
display(head)
     
# This code is contributed by Arnab Kundu


C#
// C# code to modify linked list
using System;
 
// Linked List Node
public class Node
{
    public int data;
    public Node next;
 
    // Constructor
    public Node(int data)
    {
        this.data = data;
        next = null;
    }
}
 
// Class ro perform operations
// on linked list
public class GfG
{
    // Recursive function to double the one of two
    // elements and make next one as 0,
    // which are equal before 0
    public static void changeTwoBefore0(Node head)
    {
        // there should be atleast three elements
        // to perform required operation
        if (head == null || head.next == null ||
                        head.next.next == null)
            return;
 
 
        // when two continuous elements
        // are same
        if ((head.data == head.next.data) &&
                (head.next.next.data == 0))
        {
 
            int temp = head.data;
            head.data = 2*temp;
            head.next.data = 0;
 
            if (head.next.next.next != null)
                head = head.next.next.next;
            else
                return;
        }
        else
            head = head.next;
 
        // recursive call to changeTwoBefore0
        // for next element
        changeTwoBefore0(head);
    }
 
    // function to append zeros at tail
    public static Node appendZero(Node head)
    {
        if (head == null || head.next == null)
            return head;
 
        // Find tail node
        Node tail = head;
        while (tail.next != null)
            tail = tail.next;
        Node origTail = tail;
 
        // Case when starting nodes have 0 values
        // we need to change head in this case.
        Node curr = head;
        while (curr.next != null && curr.data == 0)
        {
            tail.next = curr;
            tail = curr;
            curr = curr.next;
        }
        head = curr;
 
        // Now moving other 0s to end
        Node prev = curr;
        curr = curr.next;
         
        // We check until original tail
        while (curr != origTail)
        {
            // If current data is 0, append
            // after tail and update tail.
            if (curr.data == 0)
            {
                tail.next = curr;
                tail = curr;
                prev.next = curr.next;
            }
            else
                prev = curr;
                 
            // We always move current    
            curr = curr.next;
        }
         
        // Finally making sure that linked
        // list is null terminated.
        tail.next = null;
 
        return head;
    }
     
    public static Node doubleAndAppend0(Node head)
    {
        // Change two same nodes before 0
        changeTwoBefore0(head);
         
        // Move all 0s to end
        return appendZero(head);
    }
 
    // function to display the nodes
    public static void display(Node head)
    {
        while (head != null)
        {
            Console.Write(head.data + " -> ");
            head = head.next;
        }
    }
 
    // Driver code
    public static void Main()
    {
 
        Node head = new Node(4);
        head.next = new Node(4);
        head.next.next = new Node(0);
        head.next.next.next = new Node(2);
        head.next.next.next.next = new Node(3);
        head.next.next.next.next.next = new Node(4);
        head.next.next.next.next.next.next = new Node(3);
        head.next.next.next.next.next.next.next = new Node(3);
        head.next.next.next.next.next.next.next.next = new Node(0);
        head.next.next.next.next.next.next.next.next.next = new Node(4);
 
        Console.Write("Original linked list :\n");
        display(head);
     
        head = doubleAndAppend0(head);
 
        Console.WriteLine("\nModified linked list :");
        display(head);
    }
}
 
/* This code contributed by PrinciRaj1992 */


Javascript


输出
Original linked list :
4 -> 4 -> 0 -> 2 -> 3 -> 4 -> 3 -> 3 -> 0 -> 4 -> 
Modified linked list :
8 -> 2 -> 3 -> 4 -> 6 -> 4 -> 0 -> 0 -> 0 -> 0 -> 

时间复杂度: O(n),其中 n 是链表的节点数。

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