206. Reverse Linked List

来源:互联网 发布:nba2k15mc霍华德的数据 编辑:程序博客网 时间:2024/05/16 08:57

快慢指针是链表中常用的技巧,反转链表也是常用算法之一。
使用p和q两个指针配合工作,使得两个节点间的指向反向,同时用r记录剩下的链表。

p = head;
q = head->next;
这里写图片描述
head->next = NULL;
这里写图片描述
现在进入循环体,这是第一次循环。
r = q->next;
q->next = p;
这里写图片描述
p = q;
q =r;
这里写图片描述
第二次循环。
r = q->next
这里写图片描述
q->next = p;
这里写图片描述
p = q;
这里写图片描述
q = r
这里写图片描述
第三次循环。。。。。

具体代码如下:

class Solution {public:    ListNode* reverseList(ListNode* head) {        ListNode* pre = NULL;        while (head) {            ListNode* next = head -> next;            head -> next = pre;            pre = head;            head = next;        }         return pre;    }};

反转链表还可以采用头插法

/** * 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 || !head->next) return head;        ListNode* dummy = new ListNode(-1);        dummy->next = head;        ListNode* pre = head;        ListNode* cur = head->next;        while(cur){            pre->next = cur->next;            cur->next = dummy->next;            dummy->next = cur; //插入头部            cur = pre->next;        }        return dummy->next;    }};

也可以采用递归方法实现

/** * 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 || !head->next) return head;        ListNode* new_head = reverseList(head->next);        head->next->next = head;        head->next = NULL;        return new_head;    }};
0 0
原创粉丝点击