{
ListNode* p, *q, *r;
p=head;
q=NULL;
while(p!=NULL)
{
r=q;
q=p;
p=p->link;
q->link=r;
}
return q;
}
위에껀 내가 95퍼센트 이해한 거
{
ListNode* p, *c, *n;
p=head;
c=NULL;
while(p!=NULL)
{
n=c;
c=p;
p=p->link;
c->link=n;
}
return c;
}
여기까지가 본인이 작성함..
아래내용은 내가 더 잘 이해하기위해 다른 블로그 글을 추가함
-----------------------------------------------------------------------------------
일단 변수초기화 부분을 실행하면 아래와 같이 되겠지요.
(이미지는 Paran계정에 올려두었는데, 사이즈가 안맞아 잘려 보이네요. 클릭해서 원본 사이즈로 보시기 바랍니다.)
변수 p에는 Head를, n에는 null값을, c는 초기화하지 않았으므로 쓰레기주소값을 가집니다.
( 나중에 보시면 아시겠지만, 변수 c는 이곳에서 null로 초기화되어야 합니다 )
다음에 실질적인 while()문을 최초 실행하게 되면...
위와같이 변수의 값들이 변경됩니다.
그림설명을 잠깐 드리자면, 회색 화살표는 이전에 가리키던 값이고, 검은색화살표가 현재 변경된 값입니다. 코드에 적힌 숫자와 그림에 적힌 숫자를 매치하면서 살펴보시면 이해가 될 것입니다.
(3)번을 보시면, p = p->link 를 실행하는데, p는 현재 1번 노드를 가리키고 있고, p->link는 2번노드를 가리키므로, p = p->link 는 현재의 다음노드를 가리키라는 의미입니다.
(4)번 역시 (3)번과 일맥상통합니다. 이하 설명은 생략하고 이미지로 대신하도록 하겠습니다.
위의 그림이 좀 복잡하므로(화살표가 너무 어지럽죠?) 좀 정리를 해 보도록 하죠.
아래의 그림과 같습니다.
이해 되시리라 생각합니다.
다시한번 while()문을 적용해보겠습니다
설명은 생략하겠습니다. 복잡한 위의 그림을 다시한번 정리해보도록 하겠습니다.
아래와 같습니다.
다시 while()문을 적용합니다
다시 정리..^^;
슬슬 끝이 보이는군요. ^^
다시한번 while()문을 적용토록 하겠습니다.
정리 들어갑니다
이로서 완전한 리버스(Reverse)가 적용되었습니다. while()문의 조건이 p!=null 인데, 현재 p의 값이 null 이므로 루프를 빠져나와 c(리버스가 적용된 연결리스트의 헤드값)를 리턴하면서 함수는 종료합니다.
위의 그림을 보시면 아시겠지만, 마지막노드의 link가 쓰레기값을 가리키면서 끝나게 되지만 이는 잘못된 것입니다. 따라서 맨 처음에 언급드린 바와 같이, 변수 c또한 null값으로 초기화하는 코드가 필요하게 됩니다.
부디 이해되셨길 바랍니다. 수고하세요.