이번에는 single linked list의 노드 순서를 거꾸로 만드는 reverse linked list에 대해 배워볼 것이다. 노드 순서를 바꾸는 함수 1개만 필요하기에 함수 1개만 분석해 볼 것이다.

reverseLinkedList 함수 구현

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번째 노드부터 시작해서 점점 노드 방향이 반대가 되게 만들었다.