劍指offer:刪去連結串列中重複的節點。(題解原始碼加圖解)

想去吹吹海風發表於2021-01-02

題目

劍指offer,刪除連結串列中的重複節點。
題目描述
在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。

示例1,連結串列1->2->3->3->4->4->5
處理後為 1->2->5

示例2
輸入
{ 1, 2, 3, 3, 4, 4 }
返回值
{ 1, 2 }

解析

因為是刪重,所以不保留重複節點。
用兩個指標cur 和next判斷是否重複,
1、如果不重複保留下來,此時需要上一個節點,用prev保留,為了方便第一個節點的連結,我們建立一個哨兵位的頭節點pphead。
2、重複了則不保留,釋放cur後,cur和next繼續向後走,直到他倆不同。
3、那麼cur和next走到NULL時又有兩種情況
情況1:最後一個數字保留,如示例1,最簡單,直接保留即可。
情況2:最後一個數字不保留,如示例2,此時需要釋放它,再將prev的下一個置NULL;

圖解

在這裡插入圖片描述

程式碼

#include<Windows.h>
#include<stdio.h>
#include <assert.h>
#pragma warning (disable:4996)
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
	ListNode* deleteDuplication(ListNode* pHead)
	{
		if (pHead == NULL || pHead->next == NULL)
		{
			return pHead;
		}
		ListNode*pphead = (ListNode*)malloc(sizeof(ListNode));
		ListNode*prev = pphead;
		pphead->next = pHead;
		ListNode*cur = pHead;
		ListNode*next = pHead->next;
		while (next)
		{
			if (cur->val != next->val)
			{
				prev->next = cur;
				prev = prev->next;
				cur = cur->next;
				next = next->next;
			}
			else
			{
				while (next->val == cur->val)
				{
					ListNode*temp = cur;
					cur = next;
					next = next->next;
					free(temp);
					if (next == NULL)
					{
						break;
					}
				}
				free(cur);
				cur = next;
				if (next == NULL)
				{
					prev->next = cur;
				}
				else
				{
					next = next->next;
					if (next == NULL)
					{
						prev->next = cur;
					}
				}
			}
		}
		ListNode* realhead = pphead->next;
		free(pphead);
		return realhead;
	}
	//測試程式碼
int main()
{
	ListNode*n6 = (ListNode*)malloc(sizeof(ListNode));
	if (n6)
	{
		n6->val = 53;
		n6->next =NULL;		
	}
	ListNode*n5 = (ListNode*)malloc(sizeof(ListNode));
	if (n5)
	{
		n5->val = 53;
		n5->next = n6;

	}
	ListNode*n4 = (ListNode*)malloc(sizeof(ListNode));
	if (n4)
	{
		n4->val = 666;
		n4->next = n5;
	
	}
	ListNode*n3 = (ListNode*)malloc(sizeof(ListNode));
	if (n3)
	{
		n3->val = 133;
		n3->next = n4;

	}
	ListNode*n2 = (ListNode*)malloc(sizeof(ListNode));
	if (n2)
	{
		n2->val = 133;
		n2->next = n3;

	}
	ListNode*head = (ListNode*)malloc(sizeof(ListNode));
	if (head)
	{
		head->val = 999;
		head->next = n2;
	
	}
	ListNode* list = head;
	while (head)
	{
		printf("%10d->", head->val);
		head = head->next;
	}
	printf("NULL\n");
	head = list;
	while (head)
	{
		printf("%10p->", head);
		head = head->next;
	}
	printf("NULL\n");
	head = list;
	ListNode* sortNode = deleteDuplication(head);
	ListNode* cpylist = sortNode;
	while (sortNode)
	{
		printf("%10d->", sortNode->val);
		sortNode = sortNode->next;
	}
	printf("NULL\n");
	sortNode = cpylist;
	while (sortNode)
	{
		printf("%10p->", sortNode);
		sortNode = sortNode->next;
	}
	printf("NULL\n");
	system("pause");
}

相關文章