采用双指针遍历可以降低空间复杂度。
一 理念
双指针两个指针分别具有一定含义。
一个指针用于遍历数组 P1
一个指针用于保存数据的尾部数据(当前值) P2
二 实现原理
遍历指针去遍历数据,当P2指向的值和当前的值P1相等时,认为是重复数据。相反的,P1和P2不相等时将当前值的后一位保存为P2所指向的值。直到P2为空。
三 代码
// DataNext.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <vector>
using namespace std;
struct ListNode {
int value;
ListNode* next;
};
ListNode* createList(vector<int> vector) {
ListNode* root = new ListNode();
for (int i = vector.size() - 1; i >= 0; i--) {
ListNode* newNode = new ListNode();
newNode->value = vector[i];
newNode->next = root->next;
root->next = newNode;
root->value++;
}
return root;
}
void printList(ListNode* root) {
ListNode* tempNode = root->next;
while (tempNode) {
printf("%d ", tempNode->value);
tempNode = tempNode->next;
}
printf("\n");
}
/// <summary>
/// 采用双指针删除重复元素
/// </summary>
/// <param name="root"></param>
void deleteSameEle(ListNode* root) {
ListNode* node = root->next;
if (!node) {
return;
}
ListNode* firstNode = node;
ListNode* secondNode = node->next;
while (secondNode) {
if (firstNode->value != secondNode->value) {
firstNode->next = secondNode;
firstNode = firstNode->next;
printf("node:%d ", secondNode->value);
}
secondNode = secondNode->next;
}
}
int main()
{
vector<int> nums = { 1,2,3,4,5,5,6 };
ListNode* node = createList(nums);
printList(node);
deleteSameEle(node);
printList(node);
}