連結串列常用演算法
阿新 • • 發佈:2019-01-03
1.刪除指定節點
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: void deleteNode(ListNode* node) { node->val=node->next->val; node->next=node->next->next; } };
給定的是要刪除的節點的指標,要刪除該節點,由於無法獲取前面節點的next,無法通過修改該next指向後面的節點。
這裡將該節點的值用其後面節點的值替換,再刪除後面的節點,達到等效的作用。
2.獲取中間節點
描述:給定一個帶有頭結點 head
的非空單鏈表,返回連結串列的中間結點。如果有兩個中間結點,則返回第二個中間結點。
class solution{ public: ListNode *getMiddleNode(ListNode *head){ ListNode *fast=head; ListNode*slow=head; while(fast != NULL && fast->next != NULL){ fast=fast->next->next; slow=slow->next; } return slow; } }
快慢指標法。
另一種是將節點指標輸入到陣列,再利用陣列的隨機訪問特性。而隨機訪問正是連結串列的弱點。
3.反轉連結串列
class Solution { public: ListNode* reverseList(ListNode* head) { ListNode *next=NULL; ListNode *new_head=NULL; while(head){ next=head->next; head->next=new_head; new_head=head; head=next; } return new_head; } };