微软面试题:
输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。链表结点定义如下:
struct ListNode
{
int data;
ListNode *next;
};
ListNode* ReverseList(ListNode* head)
{
if(NULL==head|| NULL==head->next) return head;
ListNode* p;
ListNode* q;
ListNode* r;
p = head;
q = head->next;
head->next = NULL;
while(q){
r = q->next;
q->next = p;
p = q;
q = r;
}
head=p;
return head;
图文解说:
使用p和q两个指针配合工作,使得两个节点间的指向反向,同时用r记录剩下的链表。
p = head;
q = head->next;
head->next = NULL;

现在进入循环体,这是第一次循环。
r = q->next;
q->next = p;
p = q;
q =r;
第二次循环。
r = q->next
q->next = p;

p = q;
q = r

第三次循环。。。。。