迭代的解法1
用三个指针分别指向前三个节点,然后依次往后挪
/**
* 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) {
if(head==nullptr||head->next==nullptr){
return head;
}//如果链表无元素或只有一个头结点,则直接返回头结点即可
ListNode *p1=head;
ListNode *p2=head->next;
ListNode *p3=head->next->next;
p1->next=nullptr; //第一个头结点反转之后变成尾部,则next指向空
while(p3!=nullptr){
//反转元素
p2->next=p1;
//往后移动节点元素
p1=p2;
p2=p3;
p3=p3->next;
}
//注意,当最后一次的时候p3节点是null,则不在进行循环,所以要手动去反转一次
p2->next=p1;
return p2;
}
};
迭代的解法2
/**
* 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 *preNode = NULL;
while(head != NULL){
ListNode *temp = head->next;
head->next = preNode;
preNode = head;
head = temp ;
}
return preNode;
}
};
leetcode上的解释 非常经典
—————————————————————————————————
递归的解法2
public class Solution {
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null) {
return head;
}
ListNode newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
}