1. 程式人生 > 實用技巧 >連結串列 C++實現

連結串列 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、迭代
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;
}

};