Leetcode---线性数据结构(栈,链表,队列)的

来源:互联网 发布:photography美图软件 编辑:程序博客网 时间:2024/06/10 16:07

1.题目:单链表的逆转(循环和递归)

思路:

循环:用两个指针p1,p2,p1指向node,p2指向node->next;在将p2->next指向p1前,先将p2->next保存下来。然后将p1,p2依次往后挪动

递归:将链表拆分为表头节点和余下链表,将余下链表逆序后,再表头节点链接到逆序后的余下链表中

注:对于线性数据结构,比较适合用迭代循环方法,而对于树状数据结构,比如二叉树,递归方法则非常简洁优雅。

代码:

循环

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    ListNode* reverseList(ListNode* head) {        if(head==NULL)            return head;        ListNode* p1=head;        ListNode* p2=head->next;        while(p2!=NULL)        {            ListNode* temp=p2->next;            p2->next=p1;            p1=p2;            p2=temp;        }        head->next=NULL;        head=p1;        return head;    }    };

递归:

class Solution {public:    ListNode* reverseList(ListNode* head) {        if(head==NULL||head->next==NULL)            return head;        ListNode* newHead=reverseList(head->next);        head->next->next=head;        head->next=NULL;        return newHead;    }    };
可以改进的地方:循环方法使用了额外的节点存储空间做中转

改进的方法:

思路:利用head节点

代码

class Solution {public:    ListNode* reverseList(ListNode* head) {        ListNode* next;        ListNode* prev=NULL;        while(head!=NULL)        {            next=head->next;            head->next=prev;            prev=head;            head=next;        }        return prev;    }    };


2.题目:删除单链表中元素

Remove all elements from a linked list of integers that have value val.

Example
Given: 1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val = 6
Return: 1 --> 2 --> 3 --> 4 --> 5

思路

遍历整个链表,若遇到值等于val,就删除;注意head->val==val的处理。

代码:

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    ListNode* removeElements(ListNode* head, int val) {        while(head!=NULL && val==head->val)            head=head->next;        if(NULL==head)            return NULL;        ListNode* prev=head;        ListNode* pres=head->next;        while(pres!=NULL)        {            if(val==pres->val)            {                pres=pres->next;                prev->next=pres;            }            else            {                prev=pres;                pres=prev->next;            }        }        return head;    }};

其他方法:

思路:

递归的寻找val,若相等则删除,若head->val==val,head=head->next.

代码:

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    ListNode* removeElements(ListNode* head, int val) {        if(NULL==head)            return NULL;        head->next=removeElements(head->next,val);        return val==head->val?head->next:head;    }};









0 0
原创粉丝点击