1.题目实例
题意:反转一个单链表。
示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
2.解题思路
2.1双指针法
定义两个指针,一个是前指针,一个是遍历指针,前指针开始为NULL,遍历指针从头结点开始遍历,每指向一个新结点,就将其next指向为前指针所指的结点。
2.2递归法
递归法的实现其实和双指针法是一个意思,只不过代码的实现上会有不同,比较来看即可。
3.代码实现
3.1双指针法
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* cur = head;
ListNode* pre = NULL;
ListNode* tmp;//用来保存cur->next
while(cur != NULL)
{
tmp = cur->next;
cur->next = pre;//结点指向反转
pre = cur;
cur = tmp;
}
return pre;
}
};
3.2递归法
class Solution {
public:
ListNode* reverseList(ListNode* head) {
return reverse(NULL, head);//初始化cur和pre
}
ListNode* reverse(ListNode* pre, ListNode* cur)
{
if(cur == NULL)
{
return pre;
}
ListNode* tmp = cur->next;
cur->next = pre;
return reverse(cur, tmp);//相当于双指针法里的pre=cur,cur=tmp
}
};