모든 노드를 순차적으로 방문하는 코드. 반복문 코드와 재귀 코드가 있음. 이 경우에는 head 의 값이 수정될 일이 없기 때문에, head 를 넘겨줄 때 더블 포인터가 아닌 일반 포인터로 넘겨주어도 괜찮음. 물론 더블포인터로 값을 전달해도 문제는 없지만, 굳이 그렇게 할 필요는 없음.
원하는 값이 들어 있는 노드를 찾는 코드. 마찬가지 이유로 head 는 일반포인터로 정의. 만약 원하는 값이 있는 노드가 있다면 if문에 의해 해당 노드의 주소가 리턴되고, 아닐 경우에는 반복문을 벗어나 p 에 null 이 할당되어 있으므로, null 을 리턴한다.
두 개의 심플 링크드 리스트를 병합하는 코드. 만약 두 리스트 중 하나가 빈 리스트라면 그냥 하나의 리스트만 리턴하면 된다. 그게 아니라면, 첫 번째 리스트의 끝 노드까지 도달한 다음에 끝 노드의 link 에 head2 의 주소값을 넣어준 뒤 head1 을 리턴하면 된다.
노드 0 → 노드 1 → 노드 2 → 노드 3 … 이렇게 연결되어 있던 링크드 리스트를 노드 3 → 노드 2 → 노드 1 → 노드 0 으로 바꾸고 싶다면 ? Reverse Operation 을 사용하면 된다. 이건 표를 그려서 이해해야 쉽다.
표를 잘 보자. 0번째에는 q 는 널이고 p 는 헤드 즉 첫 번째 노드의 주소가 저장되어 있다. 이제 첫 번째 반복문을 돌리고 나면, r 에는 q 값이 복사가 되고, q 에는 p 값이 복사가 되고 마지막으로 p 는 그 다음 노드의 주소를 저장한다. 그 뒤 마지막으로 q 가 r 값을 가리키게 되면, r 에는 그 전 값이 들어 있게 되고 q 에는 현재 값이 들어 있으므로, q 가 r 을 가리키면, 거꾸로 가는 링크드 리스트가 만들어지게 된다.
순환 리스트의 경우 head 가 맨 마지막 노드를 가리키게 함으로써, 삽입과 삭제를 수월하게 할 수 있음. head 노드를 심플 리스트의 경우, 첫 번째 노드 전에 두엇음. 그러나 순환 리스트는 첫 번째 노드 전 노드가 마지막 노드임. 따라서 head 노드를 마지막 노드에 두는 것. (더 정확히는, 첫 번째 노드 하나 전 노드에 두는 것)
순환 리스트에서, 맨 처음에 새로운 노드를 insert 하는 경우! 만약, 빈 리스트의 경우, 노드를 넣어주고 노드의 링크에 노드 자신을 넣어준다. 그렇지 않을 경우, 새로운 노드의 링크에는 *phead 노드의 링크 값을 넣어주고, *phead 의 링크에는 새로운 노드의 주소를 넣어주면 된다.