19. Remove Nth Node From End of List
2016-03-14 16:01
477 查看
Task:
Given a linked list, remove the nth node from the end of list and return its head.
For example,
Note:
Given n will always be valid.
Try to do this in one pass.
Some Questions:
What's the length of the linked list?
Solution:
If there is no limitation of one pass, the solution is obvious: get the length of the linked list, say m, then iterates the linked list from head to find the (m-n+1)-th element and delete it.
Above-mentioned algorithm runs in O(n) time complexity and O(1) space complexity. But it didn't meet the restriction of one pass.
How to realize it?
We can use two pointers p1,p2.
Step 1: Assign head to p1 and p2;
Step 2: Let p2 moves n steps ahead;
Step 3: p1 and p2 move ahead together uniti p2 is NULL;
Finally we will find p1 locates at the last n-th element miraculously!
Thus we solve this problem perfectly.
Code:
Given a linked list, remove the nth node from the end of list and return its head.
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.
Note:
Given n will always be valid.
Try to do this in one pass.
Some Questions:
What's the length of the linked list?
Solution:
If there is no limitation of one pass, the solution is obvious: get the length of the linked list, say m, then iterates the linked list from head to find the (m-n+1)-th element and delete it.
Above-mentioned algorithm runs in O(n) time complexity and O(1) space complexity. But it didn't meet the restriction of one pass.
How to realize it?
We can use two pointers p1,p2.
Step 1: Assign head to p1 and p2;
Step 2: Let p2 moves n steps ahead;
Step 3: p1 and p2 move ahead together uniti p2 is NULL;
Finally we will find p1 locates at the last n-th element miraculously!
Thus we solve this problem perfectly.
Code:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode *p1=head,*p2=head,*pre;//step 1 pre=NULL; int i; for(i=0,p2=head;i<n;i++)//step 2 { p2=p2->next; } p1=head; while(p2)//step 3 { p2=p2->next; pre=p1; p1=p1->next; } if(pre!=NULL) pre->next=p1->next; else head=head->next; return head; } };
相关文章推荐
- NodeJs事件驱动
- Leetcode:19. Remove Nth Node From End of List(JAVA)
- node.js中使用q.js实现api的promise化
- 237. Delete Node in a Linked List
- 116. Populating Next Right Pointers in Each Node
- 19. Remove Nth Node From End of List
- 《超实用的Node.js代码段》连载一:获取Buffer对象字节长度
- hadoop集群搭建datenode为0问题的解决
- ubuntu node.js npm
- no datanode to stop
- forever nodejs管理进程
- DistRaidNode的实现
- nodejs总结
- 关于express下session的几个注意事项
- [nodejs] nodejs开发个人博客(六)数据分页
- nodejs个人博客系统
- 欲善其功,必先利其器--Nodejs调试技术总结
- 新手如何快速入门node.js
- node模块机制与异步处理详解
- 手动处理datanode磁盘间使用不均的问题