인프런 커뮤니티 질문&답변
28:40
해결된 질문
작성
·
25
0
prev->next = curr->next;
이 코드줄 이후로 prev 노드 리스트가 4->2->1로 변경되서 3이 빠진건 이해 됬는데
curr->next = head;
여기서 head가 가리키고 있는 노드 리스트가 왜 3이 빠진걸까요?
저는 curr->next = head; 실행 이후 시점에서 아래처럼 해석해서 답이 354321 나왔습니다 ㅠ.
prev 노드 리스트: 4->2->1
curr 노드 리스트: 3->5->4->3->2->1
prev,curr,head 포인터들이 모두 다른 구조체 리스트를 가리키고 있다고 생각하면서 풀었는데 이게 잘못된걸까요..?
퀴즈
자바 상속에서 자식 객체 생성 시 생성자 호출 순서의 첫 단계는 무엇일까요?
자식 클래스 생성자 코드 실행
부모 클래스의 기본 생성자 호출
자식 클래스 메소드 호출
정적 초기화 블록 실행
답변 2
0
안녕하세요, head가 직접 3을 가리키는 것이 아니라 줄줄이 가리키고 있었는데
중간에 있던 부분을 생략하고 3이 가리키고 있던 것을 이전 노드가 가리키라고 변경했기 때문에 그렇습니다.
한글로는 조금 어려워서 그림을 그려보자면
head -> 5
5 -> 4
4 -> 3
3 -> 2
prev->next = curr->next; 이렇게 하면
4 -> 3이 끊기고 4 -> 2가 됩니다.
말씀하신 대로 이 때 3이 끊긴 것이고요.
그 다음 질문 주신 curr -> next = head;는
이 시점에서 curr은 3, head 5이기 때문에
3의 next = 5가 되어서
3 -> 5 -> 4 -> 2 -> 1 요렇게 됩니다.
3이 빠진 것은 그 위에서 3을 가리키고 있는 것을 빼고, 그 다음 것을 가리키라고 변경했기 때문입니다.
0
안녕하세요, 인프런 AI 인턴입니다. polaris2024님.
질문하신 내용은 링크드 리스트에서의 노드 재배치와 포인터 조작에 관련된 사항으로 보입니다. 이 문제는 포인터들을 잘 이해하고, 리스트 조작의 과정에서의 포인터 재배열을 명확히 이해해야 합니다.
설명
prev->next = curr->next;이 코드 줄은curr노드를 리스트에서 제거하는 역할을 합니다. 4에서 3을 건너뛰고 2로 바로 연결합니다.curr->next = head;이 줄은 리스트의 맨 앞에curr노드를 추가하는 것입니다. 즉,curr노드(여기서는 3) 다음에head노드를 설정하여 리스트의 가장 앞에curr노드를 두는 것입니다.
이 과정에서의 핵심은 curr->next = head; 가 실행된 이후 curr 노드가 현재 head의 위치에 앞서게 되어 head를 포함한 전체 리스트의 맨 앞에 삽입된다는 것입니다.
그래서 최종 리스트는 먼저 curr인 노드가 머리로 오고, 그 뒤에 이전의 head 노드부터 나머지 노드들이 차례로 이어지게 됩니다.
포인터 이해의 핵심
prev,curr,head는 모두 동일한 리스트 내의 노드들입니다. 각각 다른 리스트를 가리키고 있지 않습니다.
curr가 리스트의 맨 앞으로 이동하고,head가curr의 다음을 가리키게 되는 점이 중요합니다.
기존에 유사한 질문들이 있습니다. 다음 링크들을 통해 추가적인 설명을 참고하시면 이해에 더 좋을 것 같습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.




