C++实现链表类LinkedList。节点类ListNode定义和链表类LinkedList声明已给出,需实现插入节点函数、删除节点函数、创建链表函数、查找函数、打印链表函数、反转链表函数、删除链表倒数第N个节点函数、查找链表中间节点、链表升序排序函数、删除排序链表中的重复元素函数。
代码实现如下:
#include<iostream>
#include<algorithm>
using namespace std;
class ListNode
{
public:
ListNode() : val(0), next(NULL) {}
ListNode(int x) : val(x), next(NULL) {}
int val;
ListNode* next;
}; //节点类定义
class LinkedList
{
public:
static int num;
//默认构造函数,创建head节点
LinkedList()
{
head = new ListNode(0);
}
//析构函数,删除所有节点,包括head节点
~LinkedList()
{
ListNode* tempptr;
while (head->next != NULL)
{
tempptr = head->next;
delete head;
head = tempptr;
}
delete head;
}
//从键盘上读入若干个int数,基于这些数创建一个链表
void createList()
{
int n;
cin >> n;
ListNode* p = head;
for (int i = 0; i < n; i++) {
p->next = new ListNode;
num++;
p = p->next;
cin >> p->val;
}
}
//打印链表
void print()
{
ListNode* p = head->next;
while (p)
{
cout << p->val << ' ';
p = p->next;
}
cout << endl;
}
//向链表指定位置前添加新的节点
void insert(int position, int element)
{
if (position > num) return;
ListNode* p = head;
for (int i = 0; i < position; i++) {
p = p->next;
}
ListNode* q = new ListNode;
num++;
q->val = element;
q->next = p->next;
p->next = q;
}
//移除链表指定位置的节点
void remove(int position)
{
if (position > num) return;
else if (position < num) {
ListNode* p = head;
for (int i = 0; i < position; i++) {
p = p->next;
}
ListNode* q = p->next;
p->val = q->val;
p->next = q->next;
delete q;
num--;
}
else {
ListNode* p = head;
for (int i = 0; i < position - 1; i++) {
p = p->next;
}
ListNode* q = p->next;
delete q;
p->next = NULL;
num--;
}
}
//查找指定位置的结点,返回节点的值
int find(int position)
{
if (position > num) return -1;
ListNode* p = head;
for (int i = 0; i < position; i++) {
p = p->next;
}
return p->val;
}
//反转链表
void reverseList()
{
int* p = new int[num];
ListNode* q = head->next;
for (int i = 0; i < num; i++) {
p[i] = q->val;
q = q->next;
}
q = head->next;
for (int i = 0, j = num - 1; i < num; i++, j--) {
q->val = p[j];
q = q->next;
}
delete []p;
}
//删除链表的倒数第N个结点(遍历一次)
void removeNthFromEnd(int n)//删除链表的倒数第N个结点,例:N=2,[1,2,3,4]->[1, 2, 4] ,要求只能遍历一次链表
{
if (n > num)return;
ListNode* p = head, * q = head;
for (int i = 0; i < n; i++) {
p = p->next;
}
while (p)
{
p = p->next;
q = q->next;
}
if (n != 1) {
ListNode* x = q->next;
q->val = x->val;
q->next = x->next;
delete x;
}
else
this->remove(num);
num--;
}
//查找链表的中间节点,返回节点的值,要求只能遍历一次链表(偶数返回前值)
int findMiddle()
{
ListNode* p = head, * q = head;
while (true)
{
p = p->next;
if (p == NULL)break;
p = p->next;
q = q->next;
if (p == NULL)break;
}
return q->val;
}
//链表升序排序(非数组)
void sortList()
{
ListNode* p = head->next;
ListNode* q = NULL;
if (p->val == 0)return;
//冒泡排序
for (int i = 0; i < num; i++) {
q = p;
for (int j = i + 1; j < num; j++) {
q = q->next;
if (p->val > q->val) {
swap(p->val, q->val);
}
}
p = p->next;
}
}
//删除排序链表中的重复元素
void deleteDuplicates()
{
int a[100] = {}, len_a = 0;
int b[100] = {}, len_b = 0;
ListNode* p = head->next;
ListNode* q = NULL;
for (int i = 1; i <= num; i++) {
q = p->next;
for (int j = i + 1; j <= num; j++) {
if (p->val == q->val) {
//记录q的位置
a[len_a] = j;
len_a++;
}
q = q->next;
}
p = p->next;
}
for (int i = 0; i < len_a; i++)
for (int j = i + 1; j < len_a; j++) {
if (a[i] == -1)
break;
if (a[i] == a[j])
a[j] = -1;
}
for (int i = 0; i < len_a; i++) {
if (a[i] != -1) {
b[len_b] = a[i];
len_b++;
}
}
sort(b, b+len_b - 1);
for (int i = len_b-1; i >= 0; i--)
this->remove(b[i]);
}
private:
ListNode* head;//指向链表头节点
}; //链表类
int LinkedList::num = 0;
int main() {
LinkedList a;
a.createList();
//a.insert(1, 5);
//a.remove(3);
//cout << a.find(4);
//a.reverseList();
//a.removeNthFromEnd(4);
//cout << a.findMiddle();
//a.sortList();
//a.deleteDuplicates();
a.sortList();
a.print();
system("pause");
}