LeetCode 92 反转链表②
地址:https://leetcode-cn.com/problems/reverse-linked-list-ii/
大意:给定一个链表,翻转其中的一部分
解答:
//非递归
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
ListNode *hh = new ListNode(0);
hh->next = head;
ListNode *newNode = hh;
ListNode *ordNode = head;
for(int i = 1 ; i <= n ; i ++ ){
if(i < m)
newNode = newNode->next;
ordNode = ordNode->next;
}
/*三个节点,一个是待处理的节点,一个要指向的节点,一个是next节点*/
ListNode *upNode = ordNode;
ListNode *isNode = newNode->next;
while(isNode != ordNode){
ListNode *neNode = isNode->next;
isNode->next = upNode;
upNode = isNode;
isNode = neNode;
}
newNode->next = upNode;
return hh->next;
}
};
//递归
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
ListNode *hh = new ListNode(0);
hh->next = head;
ListNode *newNode = hh;
ListNode *ordNode = head;
for(int i = 1 ; i <= n ; i ++ ){
if(i < m)
newNode = newNode->next;
ordNode = ordNode->next;
}
newNode->next = reverse(n,m,newNode->next,ordNode);
return hh->next;
}
ListNode* reverse(int n,int i,ListNode *node,ListNode *neNode){
if(i == n)
return node;
ListNode *newNode = reverse(n,i+1,node->next,neNode);
node->next->next = node;
node->next = neNode;
return newNode;
}
};