关于链表反转的问题,经典面试问题吧~值得仔细推敲和琢磨的
题目http://www.nowcoder.com/books/coding-interviews/75e878df47f24fdc9dc3e400ec6058ca?rp=1
思路1:
使用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
第三次循环。。。。。
下面是根据这个思路,自己写的代码;struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
ListNode(){}
};
ListNode *ReverseList(ListNode *pHead)
{
if (pHead == NULL)//链表为空的情况
{
return NULL;
}
else if (pHead->next == NULL)
{
return pHead;
}
else
{
ListNode *p = pHead;
ListNode *q = pHead->next;
pHead->next = NULL;
ListNode *r = q->next;
while (q)
{
r = q->next;
q->next = p;
p = q;
q = r;
//r = r->next;
}
pHead = p;
return p;
}
}
思路2:不改变链表结构
使用栈结构;或者用递归的思想(注意理解栈结构和递归的想通之处)详细看《剑指offer》P51-52