#include <iostream> #include <iterator> #include <ctime> using namespace std; struct Node { public: int element; Node *pNext; Node(int ele = 0, Node *next = NULL) :element(ele), pNext(next){} }; //函数功能:创建单链表 Node* CreateList(int arr[], int n) { Node *head = NULL; Node *temp = NULL; for (int i = n - 1; i >= 0; i--) { temp = new Node(arr[i], head); head = temp; } return head; } //函数功能:单链表排序(交换排序) void Sort(Node* &head) { Node *index1 = head; Node *index2 = NULL; for (; index1 != NULL; index1 = index1->pNext) { for (index2 = index1->pNext; index2 != NULL; index2 = index2->pNext) { if(index1->element > index2->element) swap(index1->element, index2->element); } } } //函数功能:除去单链表中的重复元素 //思想是:先对链表进行排序,将重复元素集中到一起,再删除 void Unique1(Node* head) { Sort(head); Node *p1 = head; Node *p2 = NULL; while(p1 != NULL) { p2 = p1->pNext; while (p2 != NULL && p2->element == p1->element) p2 = p2->pNext; p1->pNext = p2; p1 = p2; } } /************************************************************************/ /* 函数功能:取出单链表中的重复元素 基本思想:指针p2=current->nect一直扫描到末尾,如果p2指向的元素与head到current中的元素相同则删除*/ /************************************************************************/ void Unique2(Node *head) { Node *current = head; Node *p2 = NULL; Node *p1 = NULL;//p1指向p2前面的节点,以便删除p2 while (current != NULL) { p1 = current; p2 = current->pNext; while (p2 != NULL) { if (p2->element != current->element) { p2 = p2->pNext; p1 = p1->pNext; } else { p1->pNext = p2->pNext; //删除p2指向的元素 p2 = p2->pNext; } } current = current->pNext; } } //函数功能:输出单链表 void PrintList(Node* head) { while (head != NULL) { cout<<head->element<<" "; head = head->pNext; } cout<<endl; } //函数功能:单链表的翻转(直接将指针给翻转过去) void ReserveList(Node* &head) { Node *temp1 = head; Node *temp2 = NULL; Node *temp3 = NULL; while (temp1 != NULL) { temp2 = temp1->pNext; temp1->pNext = temp3; temp3 = temp1; temp1 = temp2; } head = temp3; } #define N 10 int main() { int arr[N]; srand((unsigned)time(0)); for(int i = 0; i < N; i++) arr[i] = rand() % 10; cout<<"排序前为:"<<endl; copy(arr, arr + N, ostream_iterator<int>(cout, " ")); cout<<endl; Node *head = CreateList(arr, N); cout<<"去掉重复元素后为:"<<endl; Unique2(head); Unique1(head); PrintList(head); cout<<"排序后为:"<<endl; Sort(head); PrintList(head); cout<<"翻转后为:"<<endl; ReserveList(head); PrintList(head); }