Given a linked list, swap every two adjacent nodes and return its head. You must solve the problem without modifying the values in the list's nodes (i.e., only nodes themselves may be changed.)
입출력 예시:
Input: head = [1,2,3,4]
Output: [2,1,4,3]
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode prevNode = new ListNode(0);
// 더미 노드 생성 -> [0,1,2,3,4]
prevNode.next = head;
// 더미 뒤부터 시작한다는 의미
ListNode newHead = prevNode;
// 리턴할 노드
while(prevNode.next!=null && prevNode.next.next!=null){
// 순서: [prevNode]->[node1]->[node2]->[next]...
ListNode node1 = prevNode.next;
ListNode node2 = node1.next;
ListNode nextNode = node2.next;
//스왑
prevNode.next = node2;
// [prevNode]-[node2]<-[node1]-[next]...
// node1, 2 서로 자리를 바꿨다기보다 node1의 위치에 node2를 데려간 것
node2.next = node1;
// [prevNode]-[node2]->[node1]-[next]...
// node1을 2의 자리로 데려간 것
node1.next = nextNode;
// [prevNode]->[node2]->[node1]->[next]...
// 한 쌍 자리 바꾸기 완료 후, node1 기준 다음 칸이 nextNode
// 다음 쌍으로 옮겨가기
// [이전 쌍의 두번째 노드 node1]-[다음 쌍...]
// node1이 유사 더미 역할 수행
prevNode = node1;
}
return newHead.next;
}
.next
로 오목 두듯이 앞에 붙였다 뒤에 붙였다 해야 해서 그림을 그리며 푸는 게 확실히 도움됐다..next
로 스왑해주는 건 대부분 동일하다.