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