亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java怎么刪除鏈表中重復的結點

發布時間:2021-12-17 13:59:38 來源:億速云 閱讀:164 作者:iii 欄目:開發技術

本篇內容主要講解“Java怎么刪除鏈表中重復的結點”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java怎么刪除鏈表中重復的結點”吧!

核心考點:鏈表操作,臨界條件檢查,特殊情況處理

在一個排序的鏈表中,存在重復的結點,請刪除該鏈表中重復的結點,重復的結點不保留,返回鏈表頭指針。

解析一:(不提倡)

解決該問題較簡單,且在寫代碼時不易出錯的做法如下:

  1. 遍歷一遍鏈表,記錄重復結點的結點值。

  2. 再遍歷一遍鏈表,逐個刪除重復結點。

該方法需要遍歷兩遍鏈表,且需要開辟額外的內存空間存儲重復結點的結點值,所以一般不提倡。

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead) {
        if(pHead == nullptr||pHead->next == nullptr) //鏈表為空或只有一個結點無需進行操作
            return pHead;
        ListNode* cur = pHead;
        unordered_set<int> filter;
		//1、遍歷鏈表找出重復的結點,將結點值存入filter
		while (cur->next)
        {
			if (cur->val == cur->next->val)
				filter.insert(cur->val);
			cur = cur->next;
        }
		//2、逐個刪除重復的結點
        //先刪除頭部的重復結點
        while(pHead&&filter.find(pHead->val) != filter.end())
        {
            pHead = pHead->next;
        }
        if(pHead == nullptr)
            return nullptr;
        //再刪除其余的重復結點
        ListNode* prev = pHead;
        ListNode* last = prev->next;
        while(last)
        {
            if(filter.find(last->val) != filter.end())
            {
                prev->next = last->next;
                last = last->next;
            }
            else
            {
                prev = prev->next;
                last = last->next;
            }
        }
        return pHead; //返回鏈表頭指針
    }
};

解析二:(正解)

我們當然應該盡可能在遍歷一遍鏈表的情況下解決該問題,這時我們需要使用兩個指針配合完成,該過程當中包含大量細節,大致步驟如下:

1.為了后續操作方便,先為該鏈表創建一個頭結點。

Java怎么刪除鏈表中重復的結點

2.使用指針prev和last遍歷鏈表,初始時prev指向頭結點,last指向頭結點的下一個結點。

Java怎么刪除鏈表中重復的結點

3.當last指向的結點值與其后一個結點的結點值相同時,last獨自后移,直到last指向結點的結點值與其下一個結點的結點值不同為止,此時讓prev指向的結點指向last的后一個結點,最后讓last指向下一個結點(圖中未后移)。

Java怎么刪除鏈表中重復的結點

4.當last指向的結點值與其后一個結點的結點值不同時,prev和last一同向后移。

Java怎么刪除鏈表中重復的結點

如此進行下去,直到last將鏈表遍歷完,鏈表當中重復的結點也就全部被刪除了,最后返回頭結點指向的鏈表即可。

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};*/
class Solution {
public:
	ListNode* deleteDuplication(ListNode* pHead) {
		if (pHead == nullptr || pHead->next == nullptr) //鏈表為空或只有一個結點無需進行操作
			return pHead;
		ListNode* head = new ListNode(0); //創建頭結點(便于操作)
		head->next = pHead; //頭結點與原鏈表建立關系
		ListNode* prev = head;
		ListNode* last = prev->next;
		while (last)
		{
			//未發現重復的結點,prev和last一同后移
			while (last->next&&last->val != last->next->val)
			{
				prev = prev->next;
				last = last->next;
			}
			//發現重復的結點,last獨自后移
			while (last->next&&last->val == last->next->val)
			{
				last = last->next;
			}
			//到達此處有三種情況:
			//1、沒有需要刪除的重復結點,是因為last->next == nullptr到此
			//2、有需要刪除的重復結點,是因為last->next == nullptr到此(鏈表后半段都需要刪除)
			//3、有需要刪除的重復結點,是因為last->val != last->next->val到此(鏈表中間某段需要刪除)
			if (prev->next != last) //說明有需要刪除的重復結點
			{
				prev->next = last->next;
			}
			last = last->next;
		}
		return head->next; //返回鏈表頭指針
	}
};

到此,相信大家對“Java怎么刪除鏈表中重復的結點”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

云和县| 黄梅县| 邻水| 土默特左旗| 三亚市| 贵阳市| 金塔县| 汝阳县| 金湖县| 莫力| 广州市| 罗山县| 连江县| 吉隆县| 郸城县| 扶余县| 望江县| 镇平县| 东安县| 京山县| 平江县| 博湖县| 新竹市| 峨山| 九台市| 南皮县| 时尚| 拜城县| 华亭县| 芦溪县| 林口县| 鹤庆县| 舞钢市| 竹北市| 十堰市| 玉屏| 华安县| 台湾省| 杭州市| 浪卡子县| 孙吴县|