1. 程式人生 > >連結串列常用演算法

連結串列常用演算法

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; } };