生活随笔
收集整理的這篇文章主要介紹了
玩转算法值面试-第五章 -在链表中穿针引线
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
5-123
數組中可以隨機訪問,相反鏈表就不行
leetcode:206
反轉一個鏈表,鏈表如果沒有特別聲明,則節點的值不發生改變
一共需要三個指針:current指向當前需要處理的指針
next指向當前需要處理的元素的下一個元素的指針
pre保存修改之后鏈表指向的指針
首先實現一個節點的反轉
然后將pre、cur、next進行更新(向后移動一個指針
pre更新為cur指針
cur更新為next指針
next由于本身的更新指向下一個元素的位置
然后再重復前面的操作:將cur指向pre指針,然后更新pre、cur、next指針
練習題:leetcode 92
using namespace std;struct ListNode{int val;ListNode *next;ListNode(int x) :val(x), next(NULL){}
}; ListNode* creatLinkedList(int arr[], int n){if(n==0)return NULL;ListNode* head=new ListNode(arr[0]);ListNode* curNode=head;for(int i=1; i<n; i++){curNode->next=new ListNode(arr[i]);curNode=curNode->next;}return head;
}void printLinkedList(ListNode* head){ListNode* curNode=head;while(curNode != NULL){cout<< curNode->val<<"->";curNode=curNode->next;}cout<<"NULL"<<endl;return;}void deleteLinkedList(ListNode* head){ListNode* curNode=head;while(curNode!=NULL){ListNode* DelNode=curNode;curNode=curNode->next;delete delNode;}return;
}
class Solution{pulic:ListNode* reverseList(ListNode* head){ListNode* pre=NULL;ListNode* cur=head;while(cur != NULL){ListNode* next=cur->next;cur->next=pre;pre=cur;cur=next;}return pre;//pre指向該鏈表的頭結點 }
};int main(){int arr[]={1,2,3,4,5};int n=sizeof(arr)/sizeof(int);//計算出arr數組中的長度 ListNode* head=createLinkedList(arr,n);printLinkedList(head);ListNode* head2=Solution().reverseList(head);printLinkedList(head2);deleteLinkedList(head2);return 0;
}
思考題:leetcode 83
leetcode86
leetcode 328題
設立鏈表的虛擬頭結點
舉例:如刪除3的元素
該邏輯對刪除最后一個元素依然使用,對刪除第一個元素不適用。
增加一個虛擬變量
練習題:leetcode 82
leetcode 21
5-4 5 6
leetcode 24
創建幾個指針去預先保留要處理的幾個節點
思考:可不可以不用next
練習題:leetcode 25
leetcode 147 為一個鏈表進行插入排序
leetcode 148 SORT LIST
寫一個排序算法,用O(n *logn)的時間復雜度為一個鏈表進行排序
自頂向上,自頂向下
雙指針技術
leetcode 19題
優化之后:只遍歷一遍鏈表,p和q之間的距離一定,p之前有多少個點不確定,當q移到NULL時停止。
總結
以上是生活随笔為你收集整理的玩转算法值面试-第五章 -在链表中穿针引线的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。