定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
解:
原理:
代码很详细了:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* cur=NULL;
ListNode* pre=head;
while(pre!=NULL)
{
//下面四个顺序是不能变的
//1.让当前的pre的下一个把保存起来,
ListNode* t= pre->next;
//2.将当前pre的指针指向cur,将指针反过来
pre->next=cur;
//3.改变cur和pre的值
cur=pre;
pre=t;
}
return cur;
}
};
第二种方法,递归:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
//用递归
//1.结束条件,如果没有节点或者只有一个节点
if(head==NULL||head->next==NULL) return head;
//2.寻找等价关系
//先对后面的部分遍历
ListNode* ret = reverseList(head->next);
//把后面的链表的指针转头指向第一个
head->next->next = head;
//第一个指向空指针
head->next =NULL;
return ret;
}
};
第三种方法:也是指针
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head == NULL) { return NULL; }
ListNode* cur = head;
while (head->next != NULL) //头指针不为空
{
//把第三个节点保存到t里
ListNode* t = head->next->next;
//让第二个节点指向cur,也就是头节点
head->next->next = cur;
//让cur等于第二个节点,不再等于头节点
cur = head->next;
//让头节点指向第三个节点
head->next = t;
}
return cur;
}
};