链表的基本操作应用2---remove
来源:互联网 发布:vs2013写c语言步骤 编辑:程序博客网 时间:2024/05/17 23:45
链表经常需要删除的一些操作。虽然简单但是容易出错。
1,Remove Nth Node From End of List
For example,
Given linked list: 1->2->3->4->5, and n = 2. After removing the second node from the end, the linked list becomes 1->2->3->5.
刚开始做的时候,做的比较麻烦的地方。针对的改进。
开始设一个伪头指针,效果更好。ListNode dummy(-1); dummy.next=head;
不用先计算链表的长度,直接两个指针一起走,不用设三个指针,后出发的指针走到删除的结点前一个结点就OK。
下面是经过修改后的代码:
ListNode* removeNthFromEnd(ListNode* head, int n) { if(!head||n<=0) return NULL; ListNode dummy(-1); dummy.next=head; ListNode *p1=&dummy,*p2=&dummy; for(int i=0;i<n;i++){ if(p1==NULL) return NULL;//n比链表长度要大 p1=p1->next; } while(p1->next!=NULL){ p1=p1->next; p2=p2->next; } //删除p2前面的结点 p2->next=p2->next->next; return dummy.next; }
Remove Linked List Elements
Example
Given: 1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val = 6
Return: 1 --> 2 --> 3 --> 4 --> 5
注意while的条件,刚开始只写p->next!=NULL;会出错,因为万一p为NULL了就出错。
ListNode* removeElements(ListNode* head, int val) { ListNode dummy(-1); dummy.next=head; if(head=NULL) return NULL; ListNode *p1=&dummy,*p2=&dummy; while(p1!=NULL&&p1->next!=NULL){//条件中的p1->next很危险,如果p1变为NULL的话。。。加一个条件就好了 if(p1->next->val==val){ p2=p1->next->next; while(p2!=NULL&&p2->val==val) p2=p2->next; p1->next=p2; } p1=p1->next; } return dummy.next; }
改进一下:只用一个指针。
写的这么乱,我都没想到一次ac。
ListNode* removeElements(ListNode* head, int val) { ListNode dummy(-1); dummy.next=head; if(head=NULL) return NULL; ListNode *p1=&dummy; while(p1&&p1->next){//条件中的p1->next很危险,如果p1变为NULL的话 if(p1->next->val==val){ p1->next=p1->next->next; }else{ p1=p1->next; } } return dummy.next; }
Remove Duplicates from Sorted List II
For example,
Given 1->2->3->3->4->4->5
, return 1->2->5
.
Given 1->1->1->2->3
, return 2->3
.
这次只用一个指针搞定。
ListNode* deleteDuplicates(ListNode* head) { if(head==NULL) return NULL; if(head->next==NULL) return head; ListNode dummy(-1); dummy.next=head; ListNode *p1=&dummy; bool find=false; while(p1!=NULL&&p1->next!=NULL){ if(p1->next->next!=NULL&&p1->next->val==p1->next->next->val){//如果发现有重复现象 do{ p1->next=p1->next->next; }while(p1->next->next!=NULL&&p1->next->val==p1->next->next->val); p1->next=p1->next->next;//把最后一个重复的删掉 }else p1=p1->next; } return dummy.next; }
0 0
- 链表的基本操作应用2---remove
- 链表的基本操作应用-reverse
- 静态链表的基本操作及其应用(实验2.3)
- 静态链表的基本操作及其应用(实验2.3)
- 线性表的基本操作及应用
- 线性表的基本操作及其应用
- 线性表的基本操作及其应用
- 链表的 基本应用
- 实验一线性表的基本操作实现及其应用
- 实验一 线性表的基本操作实现及其应用
- 顺序表的基本操作实现及其应用(实验1)
- 实验一线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 实验一 线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 线性表的基本操作实现及其应用
- 实验一线性表的基本操作实现及其应用
- 虚拟机怎么安装vmware tools
- C#中传值和传地址的思考(一)
- C++学习笔记(三)STL简介(二)
- 中文Ubuntu里用户目录里的路径改成英文
- 大家刚上线的新站如何做好seo站内优化,我谈谈自己的看法!
- 链表的基本操作应用2---remove
- iOS学习网站和博客地址收集
- CCScaleTo与CCScaleBy比较
- 正则表达式练习——将文本中的日期格式化为标准格式
- httpQuery 强大的网络下载函数
- 使用用户定义数组访问表单输入
- 黑马程序员--java高级视频_io输入与输出
- 如何用STUN协议搭建跨网络监控环境
- CentOS 6.6 安装Nginx