问题:定位倒数第k个节点
解题思路
双指针法,开始时p1,p2都指向头节点,先让p2走k步,然后p1和p2一起走,当p2指向NULL时,p1就指向倒数第k个节点了
C++代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
ListNode *p1 = head, *p2 = head;
//先让p2走k步
for(int i = 1; i <= k; i++) p2 = p2->next;
//再让 p1和p2 一起走,当p2指向NULL时,p1就指向倒数第k个节点
while(p2){
p1 = p1->next;
p2 = p2->next;
}
return p1;
}
};
问题:删除倒数第k个节点
解题思路
双指针法,开始时p1,p2都指向头节点,先让p2走N步,然后p1和p2一起走,当p2指向NULL时,p1就指向倒数第N个节点了,将p1进行删除,考虑到p1指向头节点,因此我们再使用pre指向p1的前一个结点。
C++代码
/**
* 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; //初始p1和p2都指向第一个元素
for(int i=1; i <= n; i++) p2 = p2->next; //让p2指向第n+1个元素
ListNode *pre = NULL;//pre指向p1前面一个结点
while(p2){ //当p2指针指向NULL时,p1指针就指向倒数第n个节点
pre = p1;
p1 = p1->next;
p2 = p2->next;
}
if(pre){
pre->next = p1->next;
}
else{//待删除节点p1是根节点,删除后p1下一个结点是新的根节点
head = p1->next;
}
delete p1;//释放待删除元素所占空间
return head;
}
};