问题1:
237.Delete Node in a Linked List(删除链表中某个节点)
思想:用此节点的下一个节点值覆盖要删除的那个节点值,然后删除下一个节点(地址)。
方法:两个指针法。
注意点:内容传递,地址删除
C++代码:
class Solution {
public:
void deleteNode(ListNode* node) {
auto next=node->next;
*node=*next;//内容传递
delete next;//删除地址
}
};
问题2:
83.Remove Duplicates from Sorted List(删除顺序链表中重复节点)
思想:比较前后节点的值,分类讨论。若前后相等,将后一个节点用下一个节点覆盖。若前后不相等,两个指针都往后走,但之前需要对前一个节点的下一个
方法:两个指针法。
注意点:注意地址为NULL的情况,指针向后移,需要考虑下一个地址是什么?
C++代码:
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if (head==NULL||head->next==NULL)
return head;
ListNode *p_current=head;
ListNode *p_next=head->next;
while(p_next)
{
if(p_current->val==p_next->val)
{
p_next=p_next->next;
}
else
{
p_current->next=p_next;//对下一个地址赋值
p_current=p_current->next;//前后指针向后走
p_next=p_next->next;
}
}
p_current->next=NULL;
return head;//返回删除后的链表
}
};
问题1:
203.Remove Linked List Elements(删除链表中指定节点)
思想:判断指针的值是否和指定的值相等。若不相等,指针后移,若相等删除:地址覆盖+删除中间变量+指针重新赋值
方法:两个指针法+中间变量指针。
注意点:不能只对cur删除,要使用中间变量,返回的不是head
C++代码:
*/
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
if(head == NULL)
{
return NULL;
}//if
ListNode *dummy = new ListNode(0);
dummy->next = head;
ListNode* pre = dummy;
ListNode* cur = head;
ListNode* tmp;
while (cur)
{
if (cur->val==val)
{
tmp=cur;//中间变量tmp
pre->next=cur->next;//覆盖当前位置的地址
delete tmp;//删除当前地址指针
cur=pre->next;//重新赋值变量
}
else
{
pre = pre->next;
cur = cur->next;
}
}
return dummy->next;//返回删除后的链表
}
};
总结:对C++语句理解的不够深入。
listnode应该是链表中的结点;
listnode *就是指向链表结点的指针类型;
listnode *p;也就是定义了一个指向链表结点的指针变量P
链表和指针:前后指针的指向的节点,前后指针指向节点的内容,当前指针指向的节点。