๋ฌธ์ œ ํ•ด๊ฒฐ (PS)/๋ฌธ์ œ ํ’€์ด

1721. Swapping Nodes in a Linked List [leetcode] | ๊ฐ’์ด ์•„๋‹Œ ๊ฐ์ฒด(๋…ธ๋“œ)๋ฅผ ์ง์ ‘ ๊ตํ™˜ ํ•ด๋ณด๊ธฐ

9taetae9 2024. 9. 8. 13:51
728x90

https://leetcode.com/problems/swapping-nodes-in-a-linked-list/description/

๋ฌธ์ œ๋Š” ์œ„ ๋งํฌ ์ฐธ์กฐ

 

ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ์ฒ˜์Œ ์ ‘๊ทผ ํ–ˆ์„ ๋•Œ ๊ฐ์ฒด๋ฅผ ๊ตํ™˜ํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ๋ณต์žกํ•ด ๋ณด์—ฌ ๊ฐ’๋งŒ ๊ตํ™˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ดํ›„ ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ๊ตํ™˜ํ•˜๋Š” ๋ฐฉ์‹์„ ํ•™์Šตํ•ด๋ณด์•˜๋‹ค.

 

 

ํ’€์ด ์š”์•ฝ

1. ์—์ง€ ์ผ€์ด์Šค ์ฒ˜๋ฆฌ: ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด์žˆ๊ฑฐ๋‚˜ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜

2. dummy ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ head ๋…ธ๋“œ ๊ตํ™˜์„ ์ฒ˜๋ฆฌ

3. 4๊ฐœ์˜ ํฌ์ธํ„ฐ ์‚ฌ์šฉ : prevFirst, first, prevSecond, second (๊ฐ๊ฐ ๊ตํ™˜ํ•  ๋‘ ๋…ธ๋“œ์™€ ๊ทธ ์ง์ „ ๋…ธ๋“œ๋“ค์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.)

4. ์•ž์—์„œ k๋ฒˆ์งธ ๋…ธ๋“œ(first)์™€ ์ง์ „ ๋…ธ๋“œ(prevFirst) ์ฐพ๊ธฐ

5. ๋’ค์—์„œ k๋ฒˆ์งธ ๋…ธ๋“œ(second)์™€ ์ง์ „ ๋…ธ๋“œ(prevSecond) ์ฐพ๊ธฐ  (fast ํฌ์ธํ„ฐ ์‚ฌ์šฉ)

6. ๋‘ ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ(k๊ฐ€ ๋ฆฌ์ŠคํŠธ ๊ธธ์ด์˜ ์ ˆ๋ฐ˜์ผ ๋•Œ) ๋ณ€๊ฒฝ์ด ํ•„์š” ์—†์œผ๋ฏ€๋กœ head ๋ฐ˜ํ™˜

 

 

 

1. ์—์ง€ ์ผ€์ด์Šค ์ฒ˜๋ฆฌ

if (head == null || head.next == null) return head;

 

2. dummy ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ head ๋…ธ๋“œ ๊ตํ™˜์„ ์ฒ˜๋ฆฌ

3. 4๊ฐœ์˜ ํฌ์ธํ„ฐ ์‚ฌ์šฉ: prevFirst, first, prevSecond, second (๊ฐ๊ฐ ๊ตํ™˜ํ•  ๋‘ ๋…ธ๋“œ์™€ ๊ทธ ์ง์ „ ๋…ธ๋“œ๋“ค์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.)

ListNode dummy = new ListNode(0);
dummy.next = head;
 
ListNode prevFirst = dummy;
ListNode first = head;
ListNode second = head;
ListNode prevSecond = dummy;

dummy ๋…ธ๋“œ ์ƒ์„ฑ, prevFirst, first, prevSecond, second ํฌ์ธํ„ฐ ์„ค์ •

 

4. ์•ž์—์„œ k๋ฒˆ์งธ ๋…ธ๋“œ(first)์™€ ์ง์ „ ๋…ธ๋“œ(prevFirst) ์ฐพ๊ธฐ

for (int i = 1; i < k; i++) {
    prevFirst = prevFirst.next;
    first = first.next;
}

์ฒซ ๋ฒˆ์งธ k๋ฒˆ์งธ ๋…ธ๋“œ(first)์™€ ์ง์ „ ๋…ธ๋“œ(prevFirst) ์ฐพ๊ธฐ

 

fast ํฌ์ธํ„ฐ๊ฐ€ ๋’ค์—์„œ k ๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์„ ๋„์™€์ค€๋‹ค. 

fast.next์™€ second์˜ ๊ฐ„๊ฒฉ์ด k, ๊ทธ๋ฆผ์ƒ์—์„œ๋Š” ๊ฐ„๊ฒฉ 2์ธ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

5. ๋’ค์—์„œ k๋ฒˆ์งธ ๋…ธ๋“œ(second)์™€ ์ง์ „ ๋…ธ๋“œ(prevSecond) ์ฐพ๊ธฐ  (fast ํฌ์ธํ„ฐ ์‚ฌ์šฉ)

ListNode fast = first;
while (fast.next != null) {
    fast = fast.next;
    prevSecond = second;
    second = second.next;
}

second๊ฐ€ ๋’ค์—์„œ k๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ด (fast.next == null์ธ ์ƒํ™ฉ)

 

6. first์™€ second ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๊ตํ™˜ํ•  ํ•„์š” ์—†์ด head ๋ฐ˜ํ™˜

if (first == second) return head;

 

1~6. ๊นŒ์ง€์˜ ๊ณผ์ •์„ ํ†ตํ•ด ์•ž, ๋’ค์—์„œ ๊ฐ๊ฐ k๋ฒˆ์งธ์ธ ๋…ธ๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด์ œ first, second ๋…ธ๋“œ์˜ swap์„ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋œ๋‹ค.

 

๋…ธ๋“œ ๊ตํ™˜

7.

prevFirst.next๋ฅผ second๋กœ ์„ค์ •

prevSecond.next๋ฅผ first๋กœ ์„ค์ •

 

 

prevFirst.next = second;
prevSecond.next = first;

8.first์™€ second์˜ next ํฌ์ธํ„ฐ๋ฅผ ๊ตํ™˜

 

 

ListNode temp = first.next;
first.next = second.next;
second.next = temp;

๋‘ ๋…ธ๋“œ๊ฐ€ ์™„์ „ํžˆ ๊ตํ™˜๋œ ํ›„์˜ ๋ชจ์Šต

 

๊ตํ™˜์ด ์™„๋ฃŒ๋œ ํ›„ ๋งˆ์ง€๋ง‰์œผ๋กœ dummy.next๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋œ๋‹ค.

 

 

์ฃผ์˜ : dummy.next๊ฐ€ ์•„๋‹Œ head๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์ผ๋ถ€ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ์‹คํŒจํ•œ๋‹ค.

Input

head = [1,2]  k = 1

Output (์˜ค๋‹ต)

[1]

Expected 

[2,1]

 

์‹คํŒจ ์›์ธ

head ๋…ธ๋“œ ๊ตํ™˜ ๋ฌธ์ œ

๋งŒ์•ฝ k๊ฐ€ 1์ด๊ฑฐ๋‚˜ ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด์™€ ๊ฐ™์„ ๊ฒฝ์šฐ, head ๋…ธ๋“œ๊ฐ€ ๊ตํ™˜๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ head๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๋ฉด, head ๋…ธ๋“œ๊ฐ€ ๊ตํ™˜๋œ ๊ฒฝ์šฐ์—๋„ ์›๋ž˜์˜ head๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค.

 

์ดˆ๊ธฐ ์ƒํƒœ: dummy -> 1 -> 2 head = 1

๋…ธ๋“œ ๊ตํ™˜ ํ›„: dummy -> 2 -> 1

head๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฒฝ์šฐ

head๋Š” ์—ฌ์ „ํžˆ ๊ฐ’์ด 1์ธ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

๊ฒฐ๊ณผ: [1] (์˜ค๋‹ต)

 

728x90