扁平化多级链表 |设置 2(深度明智)
我们已经讨论了一个多级链表的扁平化,其中节点有两个指针向下和下一个。在上一篇文章中,我们逐级展平了链表。当我们总是需要在每个节点的 next 之前处理向下指针时,如何展平链表。
Input:
1 - 2 - 3 - 4
|
7 - 8 - 10 - 12
| | |
9 16 11
| |
14 17 - 18 - 19 - 20
| |
15 - 23 21
|
24
Output:
Linked List to be flattened to
1 - 2 - 7 - 9 - 14 - 15 - 23 - 24 - 8
- 16 - 17 - 18 - 19 - 20 - 21 - 10 -
11 - 12 - 3 - 4
Note : 9 appears before 8 (When we are
at a node, we process down pointer before
right pointer)
资料来源:甲骨文采访
如果我们仔细观察,我们会注意到这个问题类似于树到链表的转换。我们通过以下步骤递归地展平一个链表。
1)如果节点为NULL,则返回NULL。
2)存储当前节点的下一个节点(在步骤4中使用)。
3)递归地压平列表。在展平时,跟踪最后访问的节点,以便可以在它之后链接下一个列表。
4)递归地展平下一个列表(我们从步骤 2 中存储的指针中获取下一个列表)并将其附加到最后访问的节点之后。
下面是上述想法的实现。
C++
// C++ program to flatten a multilevel linked list
#include
using namespace std;
// A Linked List Node
struct Node
{
int data;
struct Node *next;
struct Node *down;
};
// Flattens a multi-level linked list depth wise
Node* flattenList(Node* node)
{
// Base case
if (node == NULL)
return NULL;
// To keep track of last visited node
// (NOTE: This is static)
static Node *last;
last = node;
// Store next pointer
Node *next = node->next;
// If down list exists, process it first
// Add down list as next of current node
if (node->down)
node->next = flattenList(node->down);
// If next exists, add it after the next
// of last added node
if (next)
last->next = flattenList(next);
return node;
}
// Utility method to print a linked list
void printFlattenNodes(Node* head)
{
while (head)
{
printf("%d ", head->data);
head = head->next;
}
}
// Utility function to create a new node
Node* newNode(int new_data)
{
Node* new_node = new Node;
new_node->data = new_data;
new_node->next = new_node->down = NULL;
return new_node;
}
// Driver code
int main()
{
// Creating above example list
Node* head = newNode(1);
head->next = newNode(2);
head->next->next = newNode(3);
head->next->next->next = newNode(4);
head->next->down = newNode(7);
head->next->down->down = newNode(9);
head->next->down->down->down = newNode(14);
head->next->down->down->down->down
= newNode(15);
head->next->down->down->down->down->next
= newNode(23);
head->next->down->down->down->down->next->down
= newNode(24);
head->next->down->next = newNode(8);
head->next->down->next->down = newNode(16);
head->next->down->next->down->down = newNode(17);
head->next->down->next->down->down->next
= newNode(18);
head->next->down->next->down->down->next->next
= newNode(19);
head->next->down->next->down->down->next->next->next
= newNode(20);
head->next->down->next->down->down->next->next->next->down
= newNode(21);
head->next->down->next->next = newNode(10);
head->next->down->next->next->down = newNode(11);
head->next->down->next->next->next = newNode(12);
// Flatten list and print modified list
head = flattenList(head);
printFlattenNodes(head);
return 0;
}
Java
// Java program to flatten a multilevel linked list
public class FlattenList {
static Node last;
// Flattens a multi-level linked list depth wise
public static Node flattenList(Node node)
{
if(node==null)
return null;
// To keep track of last visited node
// (NOTE: This is static)
last = node;
// Store next pointer
Node next = node.next;
// If down list exists, process it first
// Add down list as next of current node
if(node.down!=null)
node.next = flattenList(node.down);
// If next exists, add it after the next
// of last added node
if(next!=null)
last.next = flattenList(next);
return node;
}
// Utility method to print a linked list
public static void printFlattenNodes(Node head)
{
Node curr=head;
while(curr!=null)
{
System.out.print(curr.data+" ");
curr = curr.next;
}
}
// Utility function to create a new node
public static Node push(int newData)
{
Node newNode = new Node(newData);
newNode.next =null;
newNode.down = null;
return newNode;
}
public static void main(String args[]) {
Node head=new Node(1);
head.next = new Node(2);
head.next.next = new Node(3);
head.next.next.next = new Node(4);
head.next.down = new Node(7);
head.next.down.down = new Node(9);
head.next.down.down.down = new Node(14);
head.next.down.down.down.down= new Node(15);
head.next.down.down.down.down.next= new Node(23);
head.next.down.down.down.down.next.down = new Node(24);
head.next.down.next = new Node(8);
head.next.down.next.down = new Node(16);
head.next.down.next.down.down= new Node(17);
head.next.down.next.down.down.next= new Node(18);
head.next.down.next.down.down.next.next= new Node(19);
head.next.down.next.down.down.next.next.next
= new Node(20);
head.next.down.next.down.down.next.next.next.down
= new Node(21);
head.next.down.next.next = new Node(10);
head.next.down.next.next.down = new Node(11);
head.next.down.next.next.next = new Node(12);
head = flattenList(head);
printFlattenNodes(head);
}
}
//Node of Multi-level Linked List
class Node
{
int data;
Node next,down;
Node(int data)
{
this.data=data;
next=null;
down=null;
}
}
//This code is contributed by Gaurav Tiwari
C#
// C# program to flatten a multilevel linked list
using System;
class FlattenList
{
static Node last;
// Flattens a multi-level linked list depth wise
public static Node flattenList(Node node)
{
if(node == null)
return null;
// To keep track of last visited node
// (NOTE: This is static)
last = node;
// Store next pointer
Node next = node.next;
// If down list exists, process it first
// Add down list as next of current node
if(node.down != null)
node.next = flattenList(node.down);
// If next exists, add it after the next
// of last added node
if(next != null)
last.next = flattenList(next);
return node;
}
// Utility method to print a linked list
public static void printFlattenNodes(Node head)
{
Node curr = head;
while(curr != null)
{
Console.Write(curr.data + " ");
curr = curr.next;
}
}
// Utility function to create a new node
public static Node push(int newData)
{
Node newNode = new Node(newData);
newNode.next =null;
newNode.down = null;
return newNode;
}
// Driver code
public static void Main()
{
Node head = new Node(1);
head.next = new Node(2);
head.next.next = new Node(3);
head.next.next.next = new Node(4);
head.next.down = new Node(7);
head.next.down.down = new Node(9);
head.next.down.down.down = new Node(14);
head.next.down.down.down.down= new Node(15);
head.next.down.down.down.down.next= new Node(23);
head.next.down.down.down.down.next.down = new Node(24);
head.next.down.next = new Node(8);
head.next.down.next.down = new Node(16);
head.next.down.next.down.down= new Node(17);
head.next.down.next.down.down.next= new Node(18);
head.next.down.next.down.down.next.next= new Node(19);
head.next.down.next.down.down.next.next.next
= new Node(20);
head.next.down.next.down.down.next.next.next.down
= new Node(21);
head.next.down.next.next = new Node(10);
head.next.down.next.next.down = new Node(11);
head.next.down.next.next.next = new Node(12);
head = flattenList(head);
printFlattenNodes(head);
}
}
// Node of Multi-level Linked List
public class Node
{
public int data;
public Node next,down;
public Node(int data)
{
this.data = data;
next = null;
down = null;
}
}
/* This code is contributed PrinciRaj1992 */
Javascript
C++
Node* flattenList2(Node* head)
{
Node* headcop = head;
stack save;
save.push(head);
Node* prev = NULL;
while (!save.empty()) {
Node* temp = save.top();
save.pop();
if (temp->next)
save.push(temp->next);
if (temp->down)
save.push(temp->down);
if (prev != NULL)
prev->next = temp;
prev = temp;
}
return headcop;
}
Java
Node flattenList2(Node head)
{
Node headcop = head;
Stack save = new Stack<>();
save.push(head);
Node prev = null;
while (!save.isEmpty()) {
Node temp = save.peek();
save.pop();
if (temp.next)
save.push(temp.next);
if (temp.down)
save.push(temp.down);
if (prev != null)
prev.next = temp;
prev = temp;
}
return headcop;
}
// This code contributed by aashish1995
Python3
def flattenList2(head):
headcop = head
save = []
save.append(head)
prev = None
while (len(save) != 0):
temp = save[-1]
save.pop()
if (temp.next):
save.append(temp.next)
if (temp.down):
save.append(temp.down)
if (prev != None):
prev.next = temp
prev = temp
return headcop
# This code is contributed by rutvik_56
C#
Node flattenList2(Node head)
{
Node headcop = head;
Stack save = new Stack();
save.Push(head);
Node prev = null;
while (!save.Count != 0)
{
Node temp = save.Peek();
save.Pop();
if (temp.next)
save.Push(temp.next);
if (temp.down)
save.Push(temp.down);
if (prev != null)
prev.next = temp;
prev = temp;
}
return headcop;
}
// This code is contributed by aashish1995
Javascript
输出:
1 2 7 9 14 15 23 24 8 16 17 18 19 20 21 10 11 12 3 4
使用堆栈数据结构的替代实现
C++
Node* flattenList2(Node* head)
{
Node* headcop = head;
stack save;
save.push(head);
Node* prev = NULL;
while (!save.empty()) {
Node* temp = save.top();
save.pop();
if (temp->next)
save.push(temp->next);
if (temp->down)
save.push(temp->down);
if (prev != NULL)
prev->next = temp;
prev = temp;
}
return headcop;
}
Java
Node flattenList2(Node head)
{
Node headcop = head;
Stack save = new Stack<>();
save.push(head);
Node prev = null;
while (!save.isEmpty()) {
Node temp = save.peek();
save.pop();
if (temp.next)
save.push(temp.next);
if (temp.down)
save.push(temp.down);
if (prev != null)
prev.next = temp;
prev = temp;
}
return headcop;
}
// This code contributed by aashish1995
蟒蛇3
def flattenList2(head):
headcop = head
save = []
save.append(head)
prev = None
while (len(save) != 0):
temp = save[-1]
save.pop()
if (temp.next):
save.append(temp.next)
if (temp.down):
save.append(temp.down)
if (prev != None):
prev.next = temp
prev = temp
return headcop
# This code is contributed by rutvik_56
C#
Node flattenList2(Node head)
{
Node headcop = head;
Stack save = new Stack();
save.Push(head);
Node prev = null;
while (!save.Count != 0)
{
Node temp = save.Peek();
save.Pop();
if (temp.next)
save.Push(temp.next);
if (temp.down)
save.Push(temp.down);
if (prev != null)
prev.next = temp;
prev = temp;
}
return headcop;
}
// This code is contributed by aashish1995
Javascript
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。