- 头插入法:
开辟一个新链表Presult头为空,通过指针pfor遍历给定的链表, 每个node都插入到Presult头部,
注意:
1.1. 每次插入node时, Presult->next都会更改, 需要先保存,保证给定链表不断
1.2. 在 Presult 头部插入后,Pfor要改为之前保存的tmp;
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if((head == NULL) || (head->next == NULL))
{
return head;
}
ListNode* presult = NULL;
ListNode* pfor = head;
while(pfor != NULL)
{
ListNode* tmp = pfor->next;
pfor->next = presult;
presult = pfor;
pfor = tmp;
}
head = presult;
return head;
}
};
- 就地反转:
从第二个node开始, 每个node的next指向前一个node,
注意: 1. 每次需要保存current的下一个节点
2. 返回的是pre节点, current节点是NULL
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if((head == NULL) || (head->next == NULL))
{
return head;
}
ListNode* pcur = head->next;
ListNode* ppre = head;
ppre->next = NULL;
while(pcur != NULL)
{
ListNode* tmp = pcur->next;
pcur->next = ppre;
ppre = pcur;
pcur = tmp;
}
return ppre;
}
};
- 递归
递推公式:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head == NULL || head->next == NULL) {
return head;
}
ListNode* node = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return node;
}
};