1. 程式人生 > >11.11(83. 刪除排序連結串列中的重複元素-----82. 刪除排序連結串列中的重複元素 II)

11.11(83. 刪除排序連結串列中的重複元素-----82. 刪除排序連結串列中的重複元素 II)

83. 刪除排序連結串列中的重複元素(通過)

思路:略

效率:22.42%

程式程式碼:

居然一次性就通過了,真是太驚喜了

class Solution {
public:
	ListNode* deleteDuplicates(ListNode* head) {
		if (!head || !head->next) return head;
		ListNode* tmp1 = head, *tmp2 = tmp1->next;//原來可以一起初始化,只是需要加上*
		while(tmp2){
			if (tmp2->val!= tmp1->val&&tmp2==tmp1->next) {
				tmp1 = tmp1->next;
				tmp2 = tmp2->next;
			}
			else if (tmp2->val == tmp1->val)
				tmp2 = tmp2->next;
			else {
				tmp1->next = tmp2;//改變指標
				tmp1 = tmp2;
				tmp2 = tmp1->next;
			}
		}
		//最後再來一個封底的操作
		tmp1->next = NULL;
		return head;
	}
};

82. 刪除排序連結串列中的重複元素 II(通過)

思路:和上面差不多的思路

效率:100%

程式程式碼(完整版本):

struct ListNode {
	int val;
	ListNode *next;
	ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
	ListNode* deleteDuplicates(ListNode* head) {
		if (!head) return head;
		//得建立一個頭結點,因為加入第一個元素就得刪除
		int flag = 0;//是不是有連續的數字
		ListNode *h = new ListNode(0);
		h->next = head;
		ListNode* tmp1 = h, *tmp2 = head;
		while (tmp2->next){
			if (tmp2->val == tmp2->next->val) {
				tmp2 = tmp2->next;
				flag = 1;//表示連續重複的數字
			}
			else if (flag == 1 && tmp2->val != tmp2->next->val) {
				tmp2 = tmp2->next;
				tmp1->next = tmp2;
				flag = 0;
			}
			else{
				tmp1 = tmp2;
				tmp2 = tmp1->next;
			}
		}
		if (flag == 1) tmp1->next = NULL;
		//接下來尋找重複的元素
		return h->next;
	}
	ListNode* create(vector<int> nums) {//建立一個連結串列
		ListNode* start = new ListNode(0);//先建立一個頭結點
		ListNode* tmp = start;
		int m = nums.size();
		int i = 0;
		while (i < m) {
			ListNode *m = new ListNode(nums[i]);//建立一個結點
			tmp->next = m;
			tmp = tmp->next;
			m->next = NULL;
			i++;
		}
		start = start->next;
		return start;//返回頭部結點
	}


	void show(ListNode* head) {
		ListNode* a = head;//表示頭結點
		while (a) {
			cout << a->val << "***";
			a = a->next;
		}
		cout << endl;
	}
};

int main() {
	int m;//表示節點的個數
	cin >> m ;
	vector<int> vec(m);
	for (int i = 0; i < m; i++) {
		cin >> vec[i];
	}
	Solution bb;
	ListNode* head = bb.create(vec);
	bb.show(head);
	ListNode* a = bb.deleteDuplicates(head);
	bb.show(a);
	return 0;
}

出現的小問題:

在上面的程式中,返回值是head和返回值是h->next的結果不一樣,這是為什麼,更改本身就是在同一個連結串列上進行的為什麼會不一樣呢???

我明白了,對於1,1,1,2,3這個向量
head指向的是1,都被拋棄了所以不能返回head。
可以有多個指標都是指向同一個節點,但是從一個節點出發只能指向一個結點,注意區分。

相關推薦

11.11(83. 刪除排序連結串列重複元素-----82. 刪除排序連結串列重複元素 II)

83. 刪除排序連結串列中的重複元素(通過) 思路:略 效率:22.42% 程式程式碼: 居然一次性就通過了,真是太驚喜了 class Solution { public: ListNode* deleteDuplicates(ListNode* head)

[Leetcode] 82. 刪除排序連結串列重複元素 II java

 給定一個排序連結串列,刪除所有含有重複數字的節點,只保留原始連結串列中 沒有重複出現 的數字。 示例 1: 輸入: 1->2->3->3->4->4->5 輸出: 1->2->5 示例 

LeetCode 82 ——刪除排序連結串列重複元素 II

1. 題目 2. 解答 新建一個連結串列,並新增一個哨兵結點,從前向後開始遍歷連結串列。 如果下一個結點的值和當前結點的值相等,則迴圈向後遍歷直到找到一個和當前結點值不相等的結點; 反之,如果下一個結點的值和當前結點的值不相等,此值即為原始連結串列中

LeetCode-82. 刪除排序連結串列重複元素 II

題目 給定一個排序連結串列,刪除所有含有重複數字的節點,只保留原始連結串列中 沒有重複出現 的數字。 示例 1: 輸入: 1->2->3->3->4->4->5 輸出: 1->2->5 示例 2: 輸入: 1->

82. 刪除排序連結串列重複元素 II

給定一個排序連結串列,刪除所有含有重複數字的節點,只保留原始連結串列中 沒有重複出現 的數字。 示例 1: 輸入: 1->2->3->3->4->4->5 輸出: 1

leetcode 82:刪除排序連結串列重複元素 II

由於是排好序的佇列,所以處理起來相對簡單 ListNode* deleteDuplicates(ListNode* head) { ListNode*l2=new ListNode(0); if(head==NULL) return head; i

*** 82 刪除排序連結串列重複元素II

ListNode *deleteDuplicates(ListNode *head) { if (head == nullptr || head->next == nullptr) return head; ListNode prehead

【LeetCode】82. 刪除排序連結串列重複元素 II

給定一個排序連結串列,刪除所有含有重複數字的節點,只保留原始連結串列中 沒有重複出現 的數字。 基本思路是第一層迴圈,兩個指標分別指向當前元素和它的前繼,目的是如果有重複,需要刪除當前元素,然後直到當前元素為空 第二層迴圈,兩個指標分別指向當前元素的下一個元素和它的前繼,

82.刪除排序連結串列重複元素

這個題一開始沒寫出來,我當時的思路是在找一個父節點而對於父節點怎麼設定無從下手。 下面這個演算法是首先建立一個父節點,然後去遍歷整個連結串列如果連結串列不為空的話繼續迴圈 而對於一個連結串列有兩種情況的點。 一個:點是當前節點的值等於下一個節點的值。如果相等需要找到所有相等的值然後複製

Leetcode 82:刪除排序連結串列重複元素 II(最詳細解決方案!!!)

給定一個排序連結串列,刪除所有含有重複數字的節點,只保留原始連結串列中 沒有重複出現 的數字。 示例 1: 輸入: 1->2->3->3->4->4->5 輸

LeetCode 82. 刪除排序連結串列重複元素 II

題目: 給定一個排序連結串列,刪除所有含有重複數字的節點,只保留原始連結串列中 沒有重複出現 的數字。 示例 1: 輸入: 1->2->3->3->4->4->5 輸出: 1->2->5 示例 2: 輸

LeetCode 82. 刪除排序連結串列重複元素 II(C++)

題目: 定一個排序連結串列,刪除所有含有重複數字的節點,只保留原始連結串列中 沒有重複出現 的數字。 示例 1: 輸入: 1->2->3->3->4->4->5 輸出: 1->2->5 示例 2:

sqlite學習筆記11:C語言使用sqlite之刪除記錄

false done mta ase rom real not null -a ubun 最後一節,這裏記錄下怎樣刪除數據。 前面全部的代碼都繼承在這裏了,在Ubuntu14.04和Mac10.9上親測通過。 #include <stdio.h> #in

資料結構實驗之連結串列七:單鏈表重複元素刪除(SDUT 2122)

#include <bits/stdc++.h> using namespace std; typedef struct node { int data; struct no

資料結構實驗之連結串列:單鏈表重複元素刪除

資料結構實驗之連結串列七:單鏈表中重複元素的刪除 按照資料輸入的相反順序(逆位序)建立一個單鏈表,並將單鏈表中重複的元素刪除(值相同的元素只保留最後輸入的一個)。 Input: 第一行輸入元素個數 n (1 <= n <= 15); 第二行輸入 n 個整數,保證在 int 範

【LeetCode & 劍指offer刷題】連結串列題4:22 刪除連結串列倒數第k個結點(19. Remove Nth Node From End of List)

【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...) 19. Remove Nth Node From End of List Given a linked list, remove the   n -th node from th

【LeetCode & 劍指offer刷題】連結串列題3:18 刪除連結串列的結點(237. Delete Node in a Linked List)

【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...) Delete Node in a Linked List Write a function to delete a node (except the tail) in a s

SDUT OJ 2122 資料結構實驗之連結串列七:單鏈表重複元素刪除

#include<iostream> #include<stdlib.h> using namespace std; typedef int ElemType; typedef struct LNode { ElemType data; stru

連結串列問題——在單鏈表和雙鏈表刪除倒數第K個節點

【題目】   分別實現兩個函式,一個可以刪除單鏈表中倒數第K個節點,另一個可以刪除雙鏈表中倒數第K個節點。 【要求】   如果連結串列長度為N,時間複雜度達到O(N),時間複雜度達到O(N),額外空間複雜度達到O(1) 【解答】   本題較為簡單,實現

LeetCode 82. 刪除排序鏈表的重復元素 II(Remove Duplicates from Sorted List II

特殊情況 代碼 size def 特殊 strong 全部 struct ext 題目描述 給定一個排序鏈表,刪除所有含有重復數字的節點,只保留原始鏈表中 沒有重復出現 的數字。 示例 1: 輸入: 1->2->3->3->4->4-&g