이번에는 single linked list의 노드 순서를 거꾸로 만드는 reverse linked list에 대해 배워볼 것이다. 노드 순서를 바꾸는 함수 1개만 필요하기에 함수 1개만 분석해 볼 것이다.
void reverseLinkedList(LinkedList* pList)
{
ListNode *pNode = NULL;//노드를 가리킬 포인터 변수
ListNode *pCurrentNode = NULL;//현재 노드
ListNode *pPrevNode = NULL;//이전 노드
if (pList != NULL)
{
pNode = pList->headerNode.pLink;//0번째 노드를 가리킴
while (pNode != NULL)
{
pPrevNode = pCurrentNode;//현재 노드를 이전 노드에 넣기
pCurrentNode = pNode;//지금 가리키고 있는 노드를 현재 노드에 넣기
pNode = pNode->pLink;//다음 노드 가리키기
pCurrentNode->pLink = pPrevNode;//이전 노드의 주소를 현재 노드의 pLink에 넣기
}
pList->headerNode.pLink = pCurrentNode;//현재 노드(가장 마지막 노드)의 주소를 헤더 노드의 pLink값(0번째 노드의 주소를 가리킴)에 넣기
}
}
다른 함수들(노드를 추가, 삭제, display하는 함수 등)은 앞서 LinkedList 시간에 전부 구현했기에 여기서는 reverseLinkedList 함수 하나만 분석할 것이다.
여기서 핵심은 pCurrentNode→pLink = pPrevNode에 넣는 것이다. 현재 노드의 다음 주소를 가리키는 pLink에 이전 노드의 주소를 넣음으로써 화살표 방향이 반대가 되게 했다.
while문을 이용해서 0번째 노드부터 시작해서 점점 노드 방향이 반대가 되게 만들었다.