题目
解答
1. 创建一个新的链表储存满足条件的答案。
2. 在新链表上创建两个结点指针,一个指向新的头结点newhead,一个指向新的尾结点 newtail。
3. 创建一个结点指针pcur遍历旧链表,找出满足Node.val = val的结点并且删除。
4. 利用phead和ptail完成新链表的链接,并且返回头结点phead。
1.创建新的链表
根据题目给出的注释信息,自定义类型为ListNode的结点指针。
typedef struct ListNode ListNode;
2.创建新的头结点和尾结点
创建头结点newhead和尾结点newtail,初始化。
ListNode* newhead,*newtail;
newhead = newtail = NULL;
3.创建指针遍历旧链表
遍历旧链表时删除与val相等的结点,其他结点由newtail记录。
需要考虑到两种情况:
1:当链表为空时,需要将newhead和newtail都指向pcur,否则无法进行解引用操作。
2:当链表不为空时,由newtail依次记录pcur遍历的数据,并且往后推移newtail。
while(pcur)//遍历旧链表找出不为val的数据
{
if(pcur->val != val)
{
//链表为空时
if(newhead == NULL)
{
newhead = newtail = pcur;
}
else
{
newtail->next = pcur;//由newtail记录数据
newtail = newtail->next;
}
}
pcur = pcur->next;
}
注意,当newtail记录完数据之后,需要将newtail->next置为空,否则会出现如下错误!!!
原本newtail记录完5之后应当结束,当时没有将newtail->next置为空,导致记录完5之后仍指向应当被删除的6,导致6被输出。
答案
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val) {
ListNode* newhead,*newtail;
newhead = newtail = NULL;
ListNode* pcur = head;
while(pcur)
{
if(pcur->val != val)
{
//链表为空时
if(newhead == NULL)
{
newhead = newtail = pcur;
}
else
{
newtail->next = pcur;
newtail = newtail->next;
}
}
pcur = pcur->next;
}
if(newtail)
newtail->next = NULL;
return newhead;
}
总结
题目总体来说还算简单,同时也有基础细节需要考虑,在此写下这道题的解法,希望自己日后能够牢记于心。如果还有新的解题思路,也希望大家多多发表意见!