1. 程式人生 > 其它 >82. 刪除排序連結串列中的重複元素 II

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

技術標籤:Leetcode

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

思路:預定一個preHead指向head
如果發現我的next->val==next->next->val
那派出個快指標去找不重複的位置,preHead指向它,再次進行判斷,如果符合標準,那麼做指標指向這個節點

第一次寫的成坨的程式碼

/*
	思路:預定一個preHead指向head
	如果發現我的next->val==next->next->val
	那派出個快指標去找不重複的位置,preHead指向它,再次進行判斷,如果符合標準,那麼做指標指向這個節點
*/
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution { public: ListNode* deleteDuplicates(ListNode* head) { ListNode preHead(0); preHead.next = head; ListNode* pleft = &preHead; ListNode* pright = pleft; while (pleft->next != NULL && pleft->next->next != NULL) {//找它後面兩個 if (pleft->next->
val == pleft->next->next->val) { //如果這倆相等的話,跳過這些相等的 pright = pleft->next->next->next; while (pright != NULL) { if (pright->val != pleft->next->val) { break; } pright = pright->next; } pleft->next = pright; }
else { pleft = pleft->next; } } return preHead.next; } };

改進一下發現可以直接弄成兩個相鄰的節點做判斷,如果右節點的next和他的next一樣那麼又節點就跑起來了
將pright利用起來,他負責指向pleft後面的一個節點

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
		ListNode preHead(0);
		preHead.next = head;
		ListNode* pleft = &preHead;
		ListNode* pright = pleft->next;//直接指定相鄰的節點
			while (pleft->next != NULL && pright->next != NULL) 
			{				
				if (pleft->next->val == pright->next->val) 
				{	//如果這倆相等的話,跳過這些相等的
					while (pright->next != NULL) 
					{
						if (pright->next->val != pleft->next->val) 
						{	//找到了下一個不相同的節點了
							break;
						}
						pright = pright->next;
					}
					pleft->next = pright->next;
				}
				else {
					pleft = pleft->next;
				}
				//找它後面兩個
				pright = pleft->next;
			}
		return preHead.next;        
    }
};