思路:注意声明三个指针,第一个用于标记新链表的头结点,第二个用于标记待插入结点,第三个用于保存剩余链表的头结点。注意置新链表的尾结点的next为空,这是一个不断向前插入新结点从而实现翻转的过程,注意判断第三个指针是否存在。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
ListNode*p1 = pHead;//标记当前结点即新链表头结点
if(p1==NULL) return NULL;
ListNode*p2 = p1->next;//标记当前结点的下一个结点即待插入结点
if(p2==NULL) return p1;
ListNode*p3 = p2->next;//保存剩余链表的头结点
ListNode*nHead = NULL;//新链表的头结点指针
while(p2)
{
p2->next = p1;
if(p1==pHead)
p1->next = NULL;//新链表尾指针的下一个结点置为空
nHead = p2;//翻转
p1 = nHead;
p2 = p3;
if(p3)
p3 = p3->next;//更新p1,p2,p3
else break;
}
return nHead;
}
};