最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 數(shù)據(jù)結(jié)構(gòu)之刪除鏈表中重復(fù)的結(jié)點(diǎn)

 更新時(shí)間:2021年12月11日 10:29:27   作者:2021dragon  
在一個(gè)排序的鏈表中,會(huì)存在重復(fù)的結(jié)點(diǎn),如何實(shí)現(xiàn)刪除該鏈表中重復(fù)的結(jié)點(diǎn),重復(fù)的結(jié)點(diǎn)不保留,并返回鏈表頭指針呢?接下來(lái)小編將帶你詳細(xì)介紹

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

在一個(gè)排序的鏈表中,存在重復(fù)的結(jié)點(diǎn),請(qǐng)刪除該鏈表中重復(fù)的結(jié)點(diǎn),重復(fù)的結(jié)點(diǎn)不保留,返回鏈表頭指針。

解析一:(不提倡)

解決該問(wèn)題較簡(jiǎn)單,且在寫代碼時(shí)不易出錯(cuò)的做法如下:

  1. 遍歷一遍鏈表,記錄重復(fù)結(jié)點(diǎn)的結(jié)點(diǎn)值。
  2. 再遍歷一遍鏈表,逐個(gè)刪除重復(fù)結(jié)點(diǎn)。

動(dòng)圖演示:

該方法需要遍歷兩遍鏈表,且需要開辟額外的內(nèi)存空間存儲(chǔ)重復(fù)結(jié)點(diǎn)的結(jié)點(diǎn)值,所以一般不提倡。

/*
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) //鏈表為空或只有一個(gè)結(jié)點(diǎn)無(wú)需進(jìn)行操作
            return pHead;
        ListNode* cur = pHead;
        unordered_set<int> filter;
		//1、遍歷鏈表找出重復(fù)的結(jié)點(diǎn),將結(jié)點(diǎn)值存入filter
		while (cur->next)
        {
			if (cur->val == cur->next->val)
				filter.insert(cur->val);
			cur = cur->next;
        }
		//2、逐個(gè)刪除重復(fù)的結(jié)點(diǎn)
        //先刪除頭部的重復(fù)結(jié)點(diǎn)
        while(pHead&&filter.find(pHead->val) != filter.end())
        {
            pHead = pHead->next;
        }
        if(pHead == nullptr)
            return nullptr;
        //再刪除其余的重復(fù)結(jié)點(diǎn)
        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; //返回鏈表頭指針
    }
};

解析二:(正解)

我們當(dāng)然應(yīng)該盡可能在遍歷一遍鏈表的情況下解決該問(wèn)題,這時(shí)我們需要使用兩個(gè)指針配合完成,該過(guò)程當(dāng)中包含大量細(xì)節(jié),大致步驟如下:

1.為了后續(xù)操作方便,先為該鏈表創(chuàng)建一個(gè)頭結(jié)點(diǎn)。

2.使用指針prev和last遍歷鏈表,初始時(shí)prev指向頭結(jié)點(diǎn),last指向頭結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)。

3.當(dāng)last指向的結(jié)點(diǎn)值與其后一個(gè)結(jié)點(diǎn)的結(jié)點(diǎn)值相同時(shí),last獨(dú)自后移,直到last指向結(jié)點(diǎn)的結(jié)點(diǎn)值與其下一個(gè)結(jié)點(diǎn)的結(jié)點(diǎn)值不同為止,此時(shí)讓prev指向的結(jié)點(diǎn)指向last的后一個(gè)結(jié)點(diǎn),最后讓last指向下一個(gè)結(jié)點(diǎn)(圖中未后移)。

4.當(dāng)last指向的結(jié)點(diǎn)值與其后一個(gè)結(jié)點(diǎn)的結(jié)點(diǎn)值不同時(shí),prev和last一同向后移。

如此進(jìn)行下去,直到last將鏈表遍歷完,鏈表當(dāng)中重復(fù)的結(jié)點(diǎn)也就全部被刪除了,最后返回頭結(jié)點(diǎn)指向的鏈表即可。

動(dòng)圖演示:

/*
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) //鏈表為空或只有一個(gè)結(jié)點(diǎn)無(wú)需進(jìn)行操作
			return pHead;
		ListNode* head = new ListNode(0); //創(chuàng)建頭結(jié)點(diǎn)(便于操作)
		head->next = pHead; //頭結(jié)點(diǎn)與原鏈表建立關(guān)系
		ListNode* prev = head;
		ListNode* last = prev->next;
		while (last)
		{
			//未發(fā)現(xiàn)重復(fù)的結(jié)點(diǎn),prev和last一同后移
			while (last->next&&last->val != last->next->val)
			{
				prev = prev->next;
				last = last->next;
			}
			//發(fā)現(xiàn)重復(fù)的結(jié)點(diǎn),last獨(dú)自后移
			while (last->next&&last->val == last->next->val)
			{
				last = last->next;
			}
			//到達(dá)此處有三種情況:
			//1、沒有需要?jiǎng)h除的重復(fù)結(jié)點(diǎn),是因?yàn)閘ast->next == nullptr到此
			//2、有需要?jiǎng)h除的重復(fù)結(jié)點(diǎn),是因?yàn)閘ast->next == nullptr到此(鏈表后半段都需要?jiǎng)h除)
			//3、有需要?jiǎng)h除的重復(fù)結(jié)點(diǎn),是因?yàn)閘ast->val != last->next->val到此(鏈表中間某段需要?jiǎng)h除)
			if (prev->next != last) //說(shuō)明有需要?jiǎng)h除的重復(fù)結(jié)點(diǎn)
			{
				prev->next = last->next;
			}
			last = last->next;
		}
		return head->next; //返回鏈表頭指針
	}
}; 

到此這篇關(guān)于Java 數(shù)據(jù)結(jié)構(gòu)之刪除鏈表中重復(fù)的結(jié)點(diǎn)的文章就介紹到這了,更多相關(guān)Java 刪除鏈表重復(fù)結(jié)點(diǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中 spring 定時(shí)任務(wù) 實(shí)現(xiàn)代碼

    java中 spring 定時(shí)任務(wù) 實(shí)現(xiàn)代碼

    java中 spring 定時(shí)任務(wù) 實(shí)現(xiàn)代碼,需要的朋友可以參考一下
    2013-03-03
  • java?String到底有多長(zhǎng)?String超出長(zhǎng)度該如何解決

    java?String到底有多長(zhǎng)?String超出長(zhǎng)度該如何解決

    在Java中,由于字符串常量池的存在,String常量長(zhǎng)度限制取決于String常量在常量池中的存儲(chǔ)大小,下面這篇文章主要給大家介紹了關(guān)于java?String到底有多長(zhǎng)?String超出長(zhǎng)度該如何解決的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • java?byte數(shù)組轉(zhuǎn)String的幾種常用方法

    java?byte數(shù)組轉(zhuǎn)String的幾種常用方法

    在Java中數(shù)組是一種非常常見的數(shù)據(jù)結(jié)構(gòu),它可以用來(lái)存儲(chǔ)多個(gè)相同類型的數(shù)據(jù),有時(shí)候,我們需要將數(shù)組轉(zhuǎn)換為字符串,以便于輸出或者傳遞給其他方法,這篇文章主要給大家介紹了關(guān)于java?byte數(shù)組轉(zhuǎn)String的幾種常用方法,需要的朋友可以參考下
    2024-09-09
  • 詳談Spring框架之事務(wù)管理

    詳談Spring框架之事務(wù)管理

    下面小編就為大家?guī)?lái)一篇詳談Spring框架之事務(wù)管理。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • 淺析SpringBoot中的過(guò)濾器和攔截器

    淺析SpringBoot中的過(guò)濾器和攔截器

    過(guò)濾器和攔截器都是為了在請(qǐng)求到達(dá)目標(biāo)處理器(Servlet或Controller)之前或者之后插入自定義的處理邏輯,下面就跟隨小編來(lái)看看它們二者的區(qū)別和具體使用吧
    2024-03-03
  • Java通過(guò)動(dòng)態(tài)代理實(shí)現(xiàn)一個(gè)簡(jiǎn)單的攔截器操作

    Java通過(guò)動(dòng)態(tài)代理實(shí)現(xiàn)一個(gè)簡(jiǎn)單的攔截器操作

    這篇文章主要介紹了Java通過(guò)動(dòng)態(tài)代理實(shí)現(xiàn)一個(gè)簡(jiǎn)單的攔截器操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java線程并發(fā)countdownlatch類使用示例

    java線程并發(fā)countdownlatch類使用示例

    javar的CountDownLatch是個(gè)計(jì)數(shù)器,它有一個(gè)初始數(shù),等待這個(gè)計(jì)數(shù)器的線程必須等到計(jì)數(shù)器倒數(shù)到零時(shí)才可繼續(xù)。
    2014-01-01
  • 簡(jiǎn)單了解Java編程中線程的創(chuàng)建與守護(hù)線程

    簡(jiǎn)單了解Java編程中線程的創(chuàng)建與守護(hù)線程

    這篇文章主要介紹了Java編程中線程的創(chuàng)建與守護(hù)線程,是Java多線程并發(fā)編程的基礎(chǔ),需要的朋友可以參考下
    2015-11-11
  • java中Pulsar?InterruptedException?異常

    java中Pulsar?InterruptedException?異常

    這篇文章主要為大家介紹了java中Pulsar?InterruptedException?異常分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • 淺談拋出異常和捕獲異常的一些區(qū)別

    淺談拋出異常和捕獲異常的一些區(qū)別

    這篇文章主要介紹了拋出異常和捕獲異常的一些區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評(píng)論

镇宁| 巴东县| 林周县| 肥乡县| 东港市| 上栗县| 宁陵县| 桃江县| 华安县| 延长县| 旬邑县| 宜宾市| 香河县| 台山市| 新竹市| 湘阴县| 屏南县| 马龙县| 巴中市| 高青县| 盱眙县| 安宁市| 启东市| 田东县| 房产| 荔浦县| 尼勒克县| 梅河口市| 宣威市| 青海省| 白玉县| 刚察县| 紫阳县| 铁岭市| 晋州市| 黑河市| 山东省| 巴马| 江西省| 兴和县| 息烽县|