反转链表
题目描述
输入一个链表,反转链表后,输出新链表的表头。
才发现牛客网链表没表头, 哭死,
递归太漂亮了(来自牛客), 忍不住提到版本一(按照先后顺序应该是版本二),
版一: 首先递归到最后一个元素并返回, 返回方式目前见到有点新意以后每次都返回这个指针(递归没有用到它, 却还能返回), 到最后一个元素时返回, 返回后的pHead指向倒数第二个元素, 把使倒数第二个元素的下一个元素指向当前元素, 令当前元素的next为null, 此后一次出栈, 同时最后一个出栈元素的next值为null, 太漂亮了
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if ((NULL == pHead) || (NULL == pHead->next)) {
return pHead;
}
ListNode* ret = ReverseList(pHead->next);
pHead->next->next = pHead;
pHead->next = NULL;
return ret;
}
};
版本一: 三个指针来回交换, 由于要交换顺序, 别忘记第一个元素的next设置为null
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if ((NULL == pHead) || (NULL == pHead->next)) {
return pHead;
}
ListNode *index1 = pHead->next;
ListNode *index2 = pHead->next;
ListNode *index3 = pHead;
while (NULL != index1) {
index1 = index2->next;
index2->next = index3;
if (index3 == pHead) {
index3->next = NULL;
}
index3 = index2;
index2 = index1;
}
return index3;
}
};
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/