题目描述
Given a linked list, remove the n-th node from the end of list and return its head.
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.
Follow up:
Could you do this in one pass?
我的解法
解题思路
想到的办法是先遍历一次链表,求出链表的长度,再删除对应的节点。
实现代码
1 | /** |
Runtime: 4 ms, faster than 85.75% of C++ online submissions for Remove Nth Node From End of List.
Memory Usage: 8.6 MB, less than 67.11% of C++ online submissions for Remove Nth Node From End of List.
高票解法
看了下题解才知道怎么只用一次遍历就能完成,思路是:
设置两个指针p和q,当p指向链表的末尾NULL时,p和q之间间隔的元素为n,删掉p下一个节点就可以了
实现代码
1 | /** |
代码分析
其实不太理解为什么都要用到dummyHead,它的next指向head。但如果不用的话就会出现各种边界问题。看了下一个动画图解和评论,好像有点理解了。因为要找的是待删除结点的前一个节点,而头结点没有前一个节点,所以设置了一个虚拟节点
知识总结
链表的节点删除