一.問(wèn)題描述
給你一個(gè)長(zhǎng)度為?n
?的鏈表,每個(gè)節(jié)點(diǎn)包含一個(gè)額外增加的隨機(jī)指針?random
?,該指針可以指向鏈表中的任何節(jié)點(diǎn)或空節(jié)點(diǎn)。
構(gòu)造這個(gè)鏈表的?深拷貝。?深拷貝應(yīng)該正好由?n
?個(gè)?全新?節(jié)點(diǎn)組成,其中每個(gè)新節(jié)點(diǎn)的值都設(shè)為其對(duì)應(yīng)的原節(jié)點(diǎn)的值。新節(jié)點(diǎn)的?next
?指針和?random
?指針也都應(yīng)指向復(fù)制鏈表中的新節(jié)點(diǎn),并使原鏈表和復(fù)制鏈表中的這些指針能夠表示相同的鏈表狀態(tài)。復(fù)制鏈表中的指針都不應(yīng)指向原鏈表中的節(jié)點(diǎn)?。
例如,如果原鏈表中有?X
?和?Y
?兩個(gè)節(jié)點(diǎn),其中?X.random --> Y
?。那么在復(fù)制鏈表中對(duì)應(yīng)的兩個(gè)節(jié)點(diǎn)?x
?和?y
?,同樣有?x.random --> y
?。
返回復(fù)制鏈表的頭節(jié)點(diǎn)。
用一個(gè)由?n
?個(gè)節(jié)點(diǎn)組成的鏈表來(lái)表示輸入/輸出中的鏈表。每個(gè)節(jié)點(diǎn)用一個(gè)?[val, random_index]
?表示:
-
val
:一個(gè)表示?Node.val
?的整數(shù)。 -
random_index
:隨機(jī)指針指向的節(jié)點(diǎn)索引(范圍從?0
?到?n-1
);如果不指向任何節(jié)點(diǎn),則為??null
?。
你的代碼?只?接受原鏈表的頭節(jié)點(diǎn)?head
?作為傳入?yún)?shù)。
OJ鏈接
二.思路分析
1.拷貝結(jié)點(diǎn)
首先拷貝結(jié)點(diǎn),并且將拷貝的結(jié)點(diǎn)鏈接到被拷貝結(jié)點(diǎn)的后一個(gè)。
?代碼
struct Node
{
int val;
struct Node *next;
struct Node *random;
};
typedef struct Node Node;
struct Node* copyRandomList(struct Node* head)
{
Node* cur = head;
while(cur)
{
Node* tmp = (Node*)malloc(sizeof(Node));
tmp->val = cur->val;
tmp->next = cur->next;
cur->next = tmp;
//迭代
cur = tmp->next;
}
}
2.將random指向相應(yīng)位置
當(dāng)老結(jié)點(diǎn)random指向NULL時(shí),新結(jié)點(diǎn)的random也指向NULL。
否則,將新結(jié)點(diǎn)的random指向老結(jié)點(diǎn)的random的下一個(gè),即為新結(jié)點(diǎn)應(yīng)指向的結(jié)點(diǎn)。
?
代碼?
cur = head;
while(cur)
{
if(cur->random == NULL)
{
cur->next->random = NULL;
}
else
{
cur->next->random = cur->random->next;
}
//迭代
cur = cur->next->next;
}
3.鏈接新鏈表,恢復(fù)原鏈表
將新malloc的結(jié)點(diǎn)尾插進(jìn)入新鏈表,恢復(fù)原鏈表的鏈接關(guān)系
代碼
//鏈接新鏈表,恢復(fù)原鏈表
Node* NewListHead = NULL;
Node* NewListTail = NULL;
cur = head;
while(cur)
{
Node* newnode = cur->next;
Node* next = newnode->next;
if(NewListHead == NULL)
{
NewListHead = NewListTail = newnode;
}
else
{
NewListTail->next = newnode;
NewListTail = newnode;
cur->next = next;
}
//迭代
cur = next;
}
return NewListHead;
?三.完整代碼
struct Node {
int val;
struct Node *next;
struct Node *random;
};
typedef struct Node Node;
struct Node* copyRandomList(struct Node* head)
{
Node* cur = head;
//拷貝結(jié)點(diǎn)
while (cur)
{
Node* tmp = (Node*)malloc(sizeof(Node));
tmp->val = cur->val;
tmp->next = cur->next;
cur->next = tmp;
//迭代
cur = tmp->next;
}
//鏈接random
cur = head;
while (cur)
{
if (cur->random == NULL)
{
cur->next->random = NULL;
}
else
{
cur->next->random = cur->random->next;
}
//迭代
cur = cur->next->next;
}
//鏈接新鏈表,恢復(fù)原鏈表
Node* NewListHead = NULL;
Node* NewListTail = NULL;
cur = head;
while (cur)
{
Node* newnode = cur->next;
Node* next = newnode->next;
if (NewListHead == NULL)
{
NewListHead = NewListTail = newnode;
}
else
{
NewListTail->next = newnode;
NewListTail = newnode;
cur->next = next;
}
//迭代
cur = next;
}
return NewListHead;
}
四.提交結(jié)果
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-445370.html
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-445370.html
到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)】[LeetCode138. 復(fù)制帶隨機(jī)指針的鏈表]的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!