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
- Leetcode---线性数据结构(栈,链表,队列)的
- 线性数据结构(线性表、链表、栈、队列、散列表)
- 简单线性数据结构:栈和队列的实现
- 数据结构(线性表,队列,栈,树,图)(Unfinished)
- 《数据结构》复习之线性表(栈和队列)
- 数据结构(一) 线性表、栈和队列
- 【数据结构练习】基于线性结构的队列
- java数据结构之线性队列的实现
- 【数据结构与算法学习笔记】PART3 线性结构(除向量外,数组、栈、队列、链表)
- 数据结构之线性表、栈、队列
- 【数据结构】线性结构:栈&队列&数组
- Java数据结构-线性表,栈,队列
- 数据结构(21)队列--线性表实现
- 【数据结构】线性循环队列
- 数据结构之线性队列
- 数据结构-线性结构-队列
- 数据结构之线性队列
- 数据结构——线性结构(4)——顺序队列与循环队列的原理
- 通过缓冲区使用socket传输文件
- SQL导出EXCEL(带表头)的存储过程
- Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结
- css 指针
- string库函数-----------总结一些常用的处理string的函数
- Leetcode---线性数据结构(栈,链表,队列)的
- php分页原理
- centos下squid的安装
- mysql如何优化大数据量情况下的distinct
- 循环-10. 求序列前N项和(15)
- WindowManager.LayoutParams.TYPE_SYSTEM_ALERT 小米MIUI 问题
- RESTful Web Services初探
- 关于listview适配器,记录而已
- CRC校验——某ATS协议悖论讨论