题目描述
输入一个链表,反转链表后,输出新链表的表头。
思路
-
第一种方法就是设置pre(表示当前节点的上一个节点), next(表示当前节点的下一个节点),因为我们要反转链表,所以第一个节点经过反转后就是最后一个节点,因此他指向为
NULL
,因此pre初始化为NULL
,核心代码:
- next = 当前节点->next;
- pre = 当前节点->next; //也就是开始反转,本来是 1–》2,变成 2–》1
- pre = phead; //更新下一个节点的前一个节点
- phead = next; //更新当前节点为下一个节点,也就是右移
-
另外一种思路就是设置两个指针p1,p2,然后设置一个p3指向头结点,注意不是首元节点,过程:
head–>1–>2–>3–>4 ====> head–>2–>1–>3–>4…… 最后变成head–>4–>3–>2–>1
AC代码
#include <iostream>
using namespace std;
typedef struct ListNode
{
int values;
struct ListNode *next;
} ListNode, *L;
void ListInsert(L &node)
{
L p = node;
L q = new ListNode; //q为要插入的节点
q->next = NULL; //
cin >> q->values;
while (p->next != NULL)
{
p = p->next;
}
q->next = p->next;
p->next = q;
}
void print(L node)
{
while (node != NULL)
{
cout << node->values << endl;
node = node->next;
}
}
class Solution
{
public:
ListNode *ReverseList(ListNode *pHead)
{
if (pHead == NULL || pHead->next == NULL)
return pHead;
ListNode *pre = NULL;
ListNode *next = NULL;
while (pHead)
{
next = pHead->next;
pHead->next = pre;
pre = pHead;
pHead = next;
}
return pre;
}
ListNode *ReverseList_2(ListNode *phead)
{
if (phead == NULL || phead->next == NULL)
return phead;
ListNode *p1, *p2;
p1 = phead; //p1指向首元节点
p2 = p1->next;
ListNode *p3 = new ListNode; //p3就是相当于头结点
p3->next = phead;
while (p2)
{
p1->next = p2->next;
p2->next = p3->next;
p3->next = p2;
p2 = p1->next;
}
return p3->next;
}
};
int main()
{
L a;
a = new ListNode;
a->next = NULL;
a->values = 99;
for (int i = 0; i < 3; i++)
{
ListInsert(a); //前插法
}
print(a); //打印链表
Solution so;
cout << "反转链表" << endl;
// print(so.ReverseList(a));
print(so.ReverseList_2(a));
return 0;
}