LeetCode 19. 删除链表的倒数第N个节点

题意

删除链表的倒数第$n$个结点,返回链表的头结点。

思路

  • 想法1:一趟扫描确定表长,第二趟删除第len - n个元素。时间复杂度:$O(n)$。
  • 想法2:题目中问能否尝试使用一次扫描实现,思考一下。用两个指针就可以了,当前面的指针指向第$n$个元素时,后面的指针开始移动,这样他俩之间始终差$n$个元素,前面的指针指向最后的位置时,后面的指针正好指向倒数第$n$个元素。

代码

  • 代码1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {

int len = 0;
ListNode *t = head;
while(t != NULL) { ++len; t = t -> next; }

ListNode res(0);
res.next = head;
t = &res;

for(int i = 0; i < len - n; ++i)
t = t -> next;

t -> next = t -> next -> next;
return res.next;
}
};
  • 代码2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {

ListNode res(0);
res.next = head;
ListNode *fast = &res, *slow = &res;

while(fast -> next)
{
if(n)
--n;
else
slow = slow -> next;
fast = fast -> next;
}

slow -> next = slow -> next -> next;
return res.next;
}
};

总结

好多“思维”题都要用到双指针的思想呢。

Donate comment here
0%