问题描述
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?
题目要求: 题目是输入一个链表和一个数字n, 然后删除倒数第n个元素之后输出链表
解题思路
- Brute force 直接先跑一边list得到里面元素的数量,然后直接得倒数第n个元素在链表中的位置,直接用个循环就可以。(具体实现没有做)
- 双指针法, 直接用第二个指针往后先走n步,然后前后两个指针一起走,第二个走到头了第一个的位置后面的元素直接删除就可以了。
代码实现
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(-1, head);
ListNode p = dummy, q = dummy;
for(int i = 0; i <= n; i++)
q = q.next;
while(q!=null) {
p = p.next;
q = q.next;
}
p.next = p.next.next;
return dummy.next;
}
复杂度分析
对于两个实现时间复杂度都是O(n),空间复杂度是O(1)
分析
没啥好说的,以后改成两天一更~因为要做点项目来丰富一下简历,发现每天三个有点费时间