链表常用算法

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

猜你喜欢

转载自www.cnblogs.com/chendaniu/p/10208002.html