2.1 编写代码,移除未排序链表中的重复节点。
不使用临时缓存:
如果不允许使用临时的缓存(即不能使用额外的存储空间),那需要两个指针, 当第一个指针指向某个元素时,第二个指针把该元素后面与它相同的元素删除, 时间复杂度O(n2 )。
C++实现代码:
#include<iostream> #include<new> using namespace std;struct ListNode {int val;ListNode *next;ListNode(int x):val(x),next(NULL) {} };void createList(ListNode *&L) {int arr[10]= {1,2,3,2,5,6,7,3,9,1};int i;ListNode *p=NULL;for(i=0; i<10; i++){ListNode *tmp=new ListNode(arr[i]);if(L==NULL){L=tmp;p=tmp;}else{p->next=tmp;p=tmp;}} }void deleteDup(ListNode *L) {if(L==NULL)return;ListNode *p=L;ListNode *q=NULL;while(p){q=p;while(q->next){if(q->next->val==p->val)q->next=q->next->next;elseq=q->next;}p=p->next;} }int main() {ListNode *head=NULL;createList(head);ListNode *p=head;while(p){cout<<p->val<<" ";p=p->next;}cout<<endl;deleteDup(head);p=head;while(p){cout<<p->val<<" ";p=p->next;}cout<<endl; }
运行结果: