链表(1)

203移除链表元素

用一个pre指针指向head之前,然后检测pre->next是否是目标元素
循环终止是pre->next为空

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode * ans=new ListNode(-1);
        ans->next=head;
        ListNode* pre=ans;
        while(pre->next!=nullptr)
        {
            if(pre->next->val==val)
            {
                pre->next=pre->next->next;
                continue;
            }
            pre=pre->next;
        }
        return ans->next;
    }
};

707设计链表

注意读题!!!!

class MyLinkedList {
public:
    MyLinkedList() {
        size=0;
        head=new ListNode(-1);
    }
    
    int get(int index) {
        if(index<0||index>=size)
        {
            return -1;
        }
        ListNode * ret=head;
        ret=ret->next;
        while(index--)
        {
            ret=ret->next;
        }
        return ret->val;
    }
    
    void addAtHead(int val) {
        ListNode* newNode=new ListNode(val);
        newNode->next=head->next;
        head->next=newNode;
        size++;
    }
    
    void addAtTail(int val) {
        ListNode * ret=head;
        ListNode * newNode=new ListNode(val);
        int index=size;
        while(index--)
        {
            ret=ret->next;
        }
        ret->next=newNode;
        size++;

    }
    
    void addAtIndex(int index, int val) {
        if(index==0)
        {
            addAtHead(val);
            return;
        }
        if(index==size){
            addAtTail(val);
            return;
        }
        if(index<0||index>=size)
        {
            return;
        }
        ListNode * pre=head;
        ListNode * newNode=new ListNode(val);
        while(index--)
        {
            pre=pre->next;
        }
        newNode->next=pre->next;
        pre->next=newNode;
        size++;
    }
    
    void deleteAtIndex(int index) {
        if(index==0)
        {
            head=head->next;
            size--;
            return;
        }
        if(index<0||index>=size)
        {
            return;
        }
        ListNode * pre=head;
        while(index--)
        {
            pre=pre->next;
        }
        pre->next=pre->next->next;
        size--;
    }
private:
    ListNode* head;
    int size;
};

206反转链表

用pre指向head之前,cur指向head
cur指向pre,然后cur和pre整体后移,
循环终止是cur=nullptr

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* temp; // 保存cur的下一个节点
        ListNode* cur = head;
        ListNode* pre = NULL;
        while(cur) {
            temp = cur->next;  // 保存一下 cur的下一个节点,因为接下来要改变cur->next
            cur->next = pre; // 翻转操作
            // 更新pre 和 cur指针
            pre = cur;
            cur = temp;
        }
        return pre;

    }
};

两两交换链表中的节点

比较简单

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* ans=new ListNode(-1);
        ans->next=head;
        ListNode* pre=ans;
        while(pre->next!=nullptr&&pre->next->next!=nullptr)
        {
            ListNode * first=pre->next;
            ListNode* second=pre->next->next;
            pre->next=second;
            first->next=second->next;
            second->next=first;
            pre=first;
        }
        return ans->next;
    }
};

19删除倒数第n个节点

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    //两次扫描
    ListNode* slnA(ListNode* head, int n)
    {
        ListNode* dummy=new ListNode(-1);
        dummy->next=head;
        ListNode* pre=dummy;
        int len=0;
        while(pre->next!=nullptr)
        {
            pre=pre->next;
            len++;
        }
        int pos=len-n;
        pre=dummy;
        while(pos--)
        {
            pre=pre->next;
        }
        pre->next=pre->next->next;
        return dummy->next;
    }
    //单次扫描
    ListNode* slnB(ListNode* head, int n)
    {
        ListNode* dummy=new ListNode(-1);
        dummy->next=head;
        ListNode* slow=dummy,* fast=dummy;
        while(n--)
        {
            fast=fast->next;
        }
        while(fast->next!=nullptr)
        {
            fast=fast->next;
            slow=slow->next;
        }
        slow->next=slow->next->next;
        return dummy->next;
    }
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        return slnB(head,n);
    }
};
posted @ 2024-01-15 10:09  LiviaYu  阅读(8)  评论(0)    收藏  举报