移除链表元素–双指针法
本系列记录了在刷Leetcode时的一些心得体会。也包括自己的做题思路。该题题目为移除链表元素,采用双指针来解决,语言为C++。
思路:
1.判断head是否为空,若空返回NULL or nullptr。(链表问题常用)
2.pre和cur分别指向第一个节点和第二个节点。
3.cur判断是否相等,若相等,一直删下去;若不相等,两个节点同时以相同速度往尾部方向移动。跳出循环。
4.这时,相当于除了第一个节点没被判断外,链表其他节点都进行了判断。所以只需要再次判断第一个节点是否与给定值相等,若相等,头指针后移动,若不相等,直接返回head;
代码
// code
struct ListNode
{
int m_val;
ListNode* next;
ListNode(int x) :m_val(x), next(NULL){
}
};
class Solution {
private:
ListNode *pre;
ListNode *cur;
public:
ListNode* removeElements(ListNode* head, int val) {
if (head == NULL){
return head; }
pre = head;
cur = head->next;
while(cur != NULL)
{
if (cur->val == val)
{
ListNode *p_cur = cur;
pre->next = cur->next;
cur = cur->next;
delete p_cur;
}
else
{
pre = pre->next;
cur = cur->next;
}
}
if (head->val == val)
{
ListNode *p_head = head;
head = head->next;
delete p_head;
}
return head;
}
};