第二章 链表part01

44 阅读2分钟

第二章 链表part01

203.移除链表元素

题目链接: leetcode.cn/problems/re…

Code :

/**
 * 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* removeElements(ListNode* head, int val) {
        ListNode* p = head;
        ListNode* pre;
​
        ListNode* NewHead;
​
        while(p != nullptr && p->val == val)
        {
            p = p->next;
        }
​
        NewHead = p;
        pre = p;
​
​
        while(p != nullptr)
        {
​
            //内循环
            if(p->val == val)
            {
                pre->next = p->next;
​
            }
            else
            {
                pre = p;
            }
​
            p = p->next;
        }
​
        return NewHead;
    }
};

707. 设计链表

题目链接: leetcode.cn/problems/de…

Code

class MyLinkedList {
public:
    struct node
    {
        int val;
        node * next;
    };
​
        // 带头 结点
​
    node * head ;
​
​
    MyLinkedList() {
        head = new node() ;
​
        head->val = 0; 
        head->next = NULL;
​
    }
    
    int get(int index) {
        int i = 0;
​
        //cout<<"------------get--------------------"<<endl;
​
        int step = index + 1;
​
        int count = 0;
​
        node * p;p = head->next;
​
        //cout<<"index : "<<index<<endl;
​
        
        //cout<<"step : "<<step<<endl;
​
        //cout<<"head->val : "<<head->val<<endl;
        
​
        if(step > head->val)
        {
            return -1;
        }
​
        if(step == 1)
        {
            return p->val;
        }
​
        
​
        count++;
​
​
        for( ; i < (step - 1) ; i++ )
        {
            if(p == NULL)
            {
                break;
            }
            p = p->next;
            
            count++;
        }
​
        //cout<<"------count : "<<count<<endl;
        
​
        if(count < (step))
        {
            return -1;
        }else
        if(count == step)
        {
            return p->val;
        }
        else
        {
            cout<<"step 溢出"<<endl;
            return -1;
        }
​
        //cout<<"-----------------------------------"<<endl;
​
    }
    
    void addAtHead(int val) {
        node * temp = new node() ;
        temp->val = val ;
        temp->next = head->next;
​
        head->next = temp;
​
        head->val ++ ;
​
    }
    
    void addAtTail(int val) {
        node * p = head->next ;
​
        node * temp = new node();
        temp->val = val;
        temp->next = NULL;
​
​
        if(p==NULL)
        {
            head->next = temp;
            head->val++;
        }
        else
        {
            while(p->next!=NULL)
            {
​
                p = p->next;
            }
​
            p->next = temp;
            head->val++;
​
​
        }
​
        
​
    }
    
    void addAtIndex(int index, int val) {
        int i = 0;
        int MoveStep = index + 1;
​
        int count = 0;
​
        node * pre;
​
        node * p = head->next;
        count++;
​
        
​
        if(index > head->val)
        {
            return ;
​
        }else
        if(index == head->val)
        {
            addAtTail(val);
​
        }else
        if(index == 0)
        {
            addAtHead(val);
        }else
        {
            for( ; i < MoveStep - 1 ; i++ )
        {
            if(p == NULL)
            {
                break;
            }
            pre = p;
            p = p->next;
            
            count++;
        }
​
        //cout<<"***********MoveStep - 1 : "<<MoveStep - 1<<endl;
​
        //cout<<"***********count : "<<count<<endl;
​
        //cout<<"***********p->val : "<<p->val<<endl;
        
        //cout<<"***********pre->val : "<<pre->val<<endl;
​
        if(count < (MoveStep))
        {
            return ;
        }else
        if(count == MoveStep)
        {
            node * temp = new node();
            temp->val = val;
            temp->next = p;
            pre->next = temp;
​
            head->val++;
            
        }
        else
        {
            cout<<"step 溢出"<<endl;
        }
        
        
        }
​
​
    }
    
    void deleteAtIndex(int index) {
        node * p = head->next;
​
        node * pre ;
​
        int step = index + 1;
​
        int i = 0;
​
        if(step > head->val )
        {
            return ;
        }
​
        if(index == 0)
        {
            head->next = head->next->next ;
​
            head->val--;
        }
        else
        {
            for( ;i< (step-1) ; i++)
            {
                pre = p;
                p = p->next;
​
            }
​
            pre->next = p->next;
​
            head->val--;
​
​
​
        }
​
    }
};
​
/**
 * Your MyLinkedList object will be instantiated and called as such:
 * MyLinkedList* obj = new MyLinkedList();
 * int param_1 = obj->get(index);
 * obj->addAtHead(val);
 * obj->addAtTail(val);
 * obj->addAtIndex(index,val);
 * obj->deleteAtIndex(index);
 */

206. 反转链表

题目链接: leetcode.cn/problems/re…

Code

/**
 * 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* reverseList(ListNode* head) {
            // 假设 为 有头 结点 
        
​
        if(head == NULL)
        {
            return NULL;
        }else
        if(head->next == NULL)
        {
            return head;            // 一个 有效 结点 时 调 了 之后  前后  一样  (有效 荷载 区) 
            
        }else                                   // xx  内容  的  积累
        {                                               
            // “头插法”
​
            ListNode * p = head;
​
            ListNode * pre = p ;
​
            ListNode * spear ;
​
            p = p->next;
​
            pre->next = NULL;
​
​
            while(p != NULL)
            {
                // 内部 操作 ———— 链表 处理
​
​
                spear = p->next;
​
                p->next = pre;
​
​
                pre = p;
                p = spear;
​
            }
​
​
            head = pre ;
​
​
            return head ;
​
​
​
        }
​
​
​
​
    }
};