大家对于链表都熟悉吗?下面要给大家分享的是删除链表中重复的结点的思路和代码实现,一起来具体的了解一下吧。
题目:
在一个排序的链表当中,存在着重复的结点,请删除掉这个链表中重复的结点,重复的结点不保留,返回链表头指针。
例:链表1->2->3->3->4->4->5 处理后为 1->2->5
思路1:
非递归的代码:
一、 首先要添加一个头节点,方便碰到第一个,第二个节点就相同的情况。
二、设置pre,last指针, pre指针指向现在确定不重复的那个节点,而last指针相当于工作指针,一直朝着后面搜索。
代码实现:if (pHead == null || pHead.next == null)
{
return pHead;
}
ListNode Head = new ListNode(0);
Head.next = pHead;
ListNode pre = Head;
ListNode last = Head.next;
while (last != null)
{
if (last.next != null && last.val == last.next.val)
{
// 找到最后的一个相同节点
while (last.next != null && last.val == last.next.val)
{
last = last.next;
}
pre.next = last.next;
last = last.next;
}
else
{
pre = pre.next;
last = last.next;
}
}
return Head.next;
思路2:
递归
代码实现:class Solution
{
public:
ListNode * deleteDuplication(ListNode * pHead)
{
if (pHead == NULL)
return NULL;
if (pHead != NULL && pHead - > next == NULL)
return pHead;
ListNode * current;
if (pHead - > next - > val == pHead - > val)
{
current = pHead - > next - > next;
while (current != NULL && current - > val == pHead - > val)
current = current - > next;
return deleteDuplication(current);
}
else
{
current = pHead - > next;
pHead - > next = deleteDuplication(current);
return pHead;
}
}
};
思路3:(三个指针解决问题,思路清晰)
代码实现:/*
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;
else
{
//新建一个节点,防止头结点要被删除
ListNode * newHead = new ListNode(-1);
newHead - > next = pHead;
ListNode * pre = newHead;
ListNode * p = pHead;
ListNode * next = NULL;
while (p != NULL && p - > next != NULL)
{
next = p - > next;
if (p - > val == next - > val) //如果当前节点的值和下一个节点的值相等
{
while (next != NULL && next - > val == p - > val) //向后重复查找
next = next - > next;
pre - > next = next; //指针赋值,就相当于删除
p = next;
}
else //如果当前节点和下一个节点值不等,则向后移动一位
{
pre = p;
p = p - > next;
}
}
return newHead - > next; //返回头结点的下一个节点
}
}
};
以上就是关于删除链表中重复的结点的3种思路和代码实现了,想了解更多相关内容,请继续关注本站的Java实例专栏了解吧!