链表反转 C++实现

1-a:链表逆序
[https://leetcode-cn.com/problems/reverse-linked-list/](leetcode 206)

/**

  • Definition for singly-linked list.
  • struct ListNode {
  • int val;
    
  • ListNode *next;
    
  • ListNode(int x) : val(x), next(NULL) {}
    
  • };
    /
    /

    测试用例:1 2 3 4 5
    预期输出:5 4 3 2 1
    */

//方法1、迭代
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* newHead=NULL;//创建新的头节点
while(head){//当原始头节点非空
ListNode* temp=head->next;
head->next=newHead;//更改当前头节点指向
newHead=head;//移动新的头节点
head=temp;//移动原始头结点到下一个头节点
}
return newHead;
}
};

//方法2、递归
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head == NULL || head->next == NULL){//进入递归,head到5跳出
return head;92
}
ListNode* pTail=reverseList(head->next);//pTail=5;
head->next->next=head;//5->4,反向循环
pTail->next=NULL;//原本4->5上一行进行反向后造成循环,因此原指向需要断开
return pTail;//返回进入下一层
}
};

1-b:链表逆序(wih Pos)
[https://leetcode-cn.com/problems/reverse-linked-list-ii/](leetcode 92)
/*
测试用例:1 2 3 4 5
2 4
预期输出:1 4 3 2 5
*/

//方法1、迭代1
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
if(m<=0||n<=0)
return NULL;
if(m==n)
return head;
ListNode* temp=head;
ListNode* prev=temp;
ListNode* temp2=head;

    for(int i=1;i<m;++i){
        prev=temp;
        temp=temp->next;
    }//tempPos=m;
    for(int i=1;i<n;++i){
        temp2=temp2->next;
    }//temp2Pos=n;


    if(temp!=NULL||temp2!=NULL){
        ListNode* newHead=reverse(temp,temp2->next);//引入1-a中迭代
        if(prev!=temp){//判断m是否是1
            prev->next=newHead;//连接头节点
            return head;
        }
        else
            return newHead;
            
    }
    return NULL;
}
ListNode* reverse(ListNode* head,ListNode* pTail){
    if(head==NULL)
        return NULL;
    ListNode* newHead=pTail;
     ListNode* temp=NULL;
    while(head!=pTail){
        temp=head->next;
        head->next=newHead;
        newHead=head;
        head=temp;  
    }
    return newHead;
}

};

//方法2、迭代2
ListNode* reverseBetween(ListNode* head,int m,int n){
int changeLen=n-m+1;
ListNode* pre_head=NULL;
ListNode* result=head;
m-=1;
while(head && m)
{//找到mPos
--m;
pre_head=head;
head=head->next;
}
ListNode* pTail=head;
ListNode* newHead=NULL;
while(head&&changeLen){//逆序n-m+1个
ListNode* Next=head->next;
head->next=newHead;
newHead=head;
head=Next;
--changeLen;
}
pTail->next=head;//翻转尾部连接下一节点

if(pre_head!=NULL){//常规情况
pre_head->next=newHead;
}
else{//m==1,pre_head=NULL没有改变
return newHead;
}
return result;
}

posted @ 2020-11-04 18:12  Colin_Code  阅读(238)  评论(0)    收藏  举报