18.删除链表的节点

题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表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节点的下一个节点
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值