题目描述
输入一个链表,反转链表后,输出链表的所有元素。
三个指针 pre ,cur,next
初始状态,pre是NULL,cur指向当前的头节点Hhead,next指向头节点Hhead的下一个节点B。首先从A节点开始逆序,将A节点的next指针指向prev,因为prev的当前值是NULL,所以A节点就从链表中脱离出来了,然后移动head和next指针,使它们分别指向B节点和B的下一个节点C(因为当前的next已经指向B节点了,因此修改A节点的next指针不会导致链表丢失)。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
ListNode* head = NULL;
ListNode* pre = NULL;
ListNode* pnext = head->next;
head = pHead;
if(pHead == NULL)
{
return NULL;
}
while(head != NULL)
{
//先保存head的next节点,再让head指向前驱结点
pnext = head->next;
head->next = pre;
//让head 和pre两个指针向前走
pre = head;
head = pnext;
}
return pre;
}
};
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
//如果链表为空或者链表中只有一个元素
if(pHead==NULL||pHead->next==NULL)
{
return pHead;
}
ListNode* pre = NULL;
ListNode* cur = pHead;
ListNode* pnext = cur->next;
while(cur)
{
pnext = cur->next;
cur->next = pre;
pre = cur;
cur = pnext;
}
return pre;
}
};
//第二种方法是:递归方法 /*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
//如果链表为空或者链表中只有一个元素
if(pHead==NULL||pHead->next==NULL) return pHead;
//先反转后面的链表,走到链表的末端结点
ListNode* pReverseNode=ReverseList(pHead->next);
//再将当前节点设置为后面节点的后续节点
pHead->next->next=pHead;
pHead->next=NULL;
return pReverseNode;
}
};