题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
------------------------------------------------------------------------------
1. 首先添加一个头节点,以方便碰到第一个,第二个节点就相同的情况
2.设置 pre ,last 指针, pre指针指向当前确定不重复的那个节点,而last指针相当于工作指针,一直往后面搜索。
自己想法:
我的想法也是不用递归,new一个辅助节点,防止第一二个就是重复。用两个指针,第一个指针是指向当前不重复的节点first,第二个指针pNode用来往后搜索重复节点。
在编代码时候发现自己对节点和指针的概念还不是很明白,比如最后代码:
return first1->next;//这个一开始写的是return first->next;first是指针,而first1是节点
//指针和节点还是弄的不是很明白,这个应该返回first1节点的下一个节点
指针是不能返回下一个链表的,链表是由一个个节点组成的,而指针只是负责指到某个节点,就是指示作用。所以
pnode = pnode->next就是指针的往下搜索,指向节点。
代码:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if (pHead ==NULL ||pHead->next == NULL)
{
return pHead;
}
ListNode * first1 = new ListNode(0);
first1->next = pHead;//这个是节点之间的指向关系,first1的下一个节点是phead,而不是指针关系
ListNode * first = first1;//这个是指针关系,first指针指向first1节点
ListNode * pNode = pHead;//这个是指针关系,pNode指针指向pHead节点
while (pNode !=NULL )
{
if (pNode !=NULL &&pNode->next != NULL && pNode->next->val == pNode->val)
{
while (pNode !=NULL &&pNode->next->val == pNode->val && pNode->next != NULL)
{
pNode = pNode->next;
}
first->next = pNode->next;
pNode = pNode->next;
}
else
{
first = first->next;
pNode = pNode->next;
}
}
return first1->next;//这个一开始写的是return first->next;first是指针,而first1是节点
//指针和节点还是弄的不是很明白,这个应该返回first1节点的下一个节点
}
};