翻转一个链表
样例
给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null
原地翻转,需要借助三个临时指针,进行原地翻转,简单的理解就是讲指向进行反向。具体代码如下:
/**
* Definition of ListNode
*
* class ListNode {
* public:
* int val;
* ListNode *next;
*
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param head: The first node of linked list.
* @return: The new head of reversed linked list.
*/
ListNode *reverse(ListNode *head) {
// write your code here
//原地翻转
if(!head)return head;
ListNode *p = head,*q = NULL,*r = head->next;
while(1){
p->next = q;
q = p;
p = r;
if(p == NULL)break;
r = r->next;
}
return q;
}
};
递归方法翻转:
class Solution {
public:
/**
* @param head: The first node of linked list.
* @return: The new head of reversed linked list.
*/
ListNode *reverse(ListNode *head) {
// write your code here
//递归翻转
if(head == nullptr || head->next == nullptr)return head;
ListNode* preverse = reverse(head->next);
head->next->next = head;
head->next = nullptr;
return preverse;
}
};