现在有一个难题,对于一个单向链表,Mayuyu想通过修改指针将它进行反转。
嗯,对于这个问题,我们只需要考虑链表中当前的节点与它的前驱和后继的指针指向情况就可以了。这样我们对于每
一个当前的节点都做同样的操作,这样下去就可以修改所有的指针,把链表进行反转,时间复杂度为O(n)。
如上图,对于当前节点cur,我们必然要修改它的next指针,那么所以先把cur->next保存在一个临时变量tmp里,
然后接下来就应该调整cur与pre之间的指针了。既然是反转,那么应该把cur的next域设置为pre,然后再把pre和
cur都向右移动一个一步,即pre = cur, cur = tmp。当然循环条件是cur不为空。最后不要忘了把head重新设
置为pre,因为cur此时是NULL,那么pre必定是最后一个节点,所以最后一个节点变为head。
经过上述描述,很容易得到如下代码:
list *reverseList(list *head)
{
assert(head);
list *tmp;
list *pre = head;
list *cur = head->next;
while(cur)
{
tmp = cur->next;
cur->next = pre;
pre = cur;
cur = tmp;
}
head = pre;
return head;
}