Day 11 双指针(简单)
Q1 删除链表的节点
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteNode(ListNode* head, int val) {
ListNode *q;
ListNode *p = head;
if(p->val == val) return head->next; //删除头结点
if(!head) return head; //空链表直接返回
while(p)
{
if(p->val != val )
{
q = p;
p = p->next;
}else{
q->next = p->next;
break;
}
}
return head;
}
};
Q2 链表中倒数第k个节点
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
经典题目。
/**
* 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) {
int n = 1;
ListNode* p = head,*q = head;
while(p)
{
p = p->next;
if(++n == k) break;
}
while(p->next)
{
p = p->next;
q = q->next;
}
return q;
}
};