又见面啦,接下来的链表相关Oj题目我会根据我自己的理解来给大家讲解,包括解析和代码,希望你可以对链表有更加深入的理解!!
题目:
先上链接:
OJ题目
给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点 。
方法一:迭代
想法:遍历链表,找到这个val前面一个结点,让这个结点指向val的next
注意:在寻找为给定值的结点时,需要先判断结点是否为空结点
if (head != nullptr && head->val == val) {
head = head->next;
}
结果如下:
struct ListNode* removeElements(struct ListNode* head, int val) {
if (head != nullptr && head->val == val) {
head = head->next;
}
if(NULL==head){
return head;
}
struct ListNode*pre=head;
while(pre->next!=NULL)
{
if(pre->next->val==val)
{
pre->next=pre->next->next;
}
else
{
pre=pre->next;
}
}
return head;
}
方法二:双指针
设置两个指针,值为head
cur右移判断他的val 是否为要删除的值,如果不是pre右移
直到cur->val==val;这个时候的pre就是这个需要删除结点的前结点,让pre->next=cur->next, 遍历完整个链表就可以了
看一下代码
struct ListNode* removeElements(struct ListNode* head, int val){
while (NULL != head && head->val == val) {
head = head->next;
}
struct ListNode* cur = head;
struct ListNode* pre = head;
while (cur != NULL) {
if (cur->val == val) {
pre->next = cur->next;
} else {
pre = cur;
}
cur = cur->next;
}
return head;
}
虚拟头结点
可以通过在头结点前增加虚拟头结点,这样子头结点就变成了普通结点
看代码
struct ListNode* removeElements(struct ListNode* head, int val) {
struct ListNode*dummyhead=malloc(sizeof(struct ListNode));
if(dummyhead==NULL){
return NULL;
}
dummyhead->next=head;
struct ListNode*cur=dummyhead;
while(cur->next!=NULL)
{
if(cur->next->val==val){
cur->next=cur->next->next;
}
else{
cur=cur->next;
}
}
struct ListNode*retNode=dummyhead->next;
free(dummyhead);
return retNode;
}
每天进步一点点,积少成多,大家一起努力!