Problem From.
https://leetcode.com/problems/swapping-nodes-in-a-linked-list/
오늘 문제는 linked list 가 주어졌을때, 앞에서부터 k 번째 node 와 뒤에서부터 k 번째의 node 를 서로 바꾸는 문제였다.
앞에서부터 k 번째 노드는 앞에서부터 k 번 반복하면서 보면 금방 찾을 수 있지만, 뒤에서부터 k 번째 노드는 다른 방법을 사용해야했다.
먼저 앞에서부터 k 번 탐색하여 찾은 노드를 기준점으로 두고, head 에서부터 시작하는 또 다른 포인터를 둔다.
그리고 k번째 노드가 한번 다음으로 나갈때마다 head 의 포인터를 한단계 다음으로 옮긴다. 이를 반복하면서 k번째 노드에서 시작한 포인터의 next 가 null 이 될때까지 반복하면, head 에 있던 포인터는 뒤에서부터 k 번째 노드에 멈추게 된다.
/**
* Example:
* var li = ListNode(5)
* var v = li.`val`
* Definition for singly-linked list.
* class ListNode(var `val`: Int) {
* var next: ListNode? = null
* }
*/
class Solution {
fun swapNodes(head: ListNode?, k: Int): ListNode? {
var tempNode : ListNode? = null
var startNode : ListNode? = null
var endNode : ListNode? = null
for(i in 1..k) {
if(i == 1) tempNode = head
else tempNode = tempNode?.next
}
startNode = tempNode
endNode = head
while(tempNode?.next != null) {
endNode = endNode?.next
tempNode = tempNode?.next
}
val swap = startNode?.`val`
startNode?.`val` = endNode?.`val`
endNode?.`val` = swap
return head
}
}