C++ 实现单链表
基本思路
首先创建一个结点类,在单链表中需要有头结点、尾结点、当前结点、结点数目,此处将head头结点定义为一个不带值的结点,同时将其下标设置为0,这样就做到了插入的是第几个元素,则该元素下标就是多少,curr指当前节点的前一个结点,这样方便结点的插入。
代码实现
#include <iostream>
using namespace std;
template <typename T>
class Node
{
public:
T value;
Node *next;
Node(Node *next = NULL)
{
this->next = next;
}
Node(T value, Node *next = NULL)
{
this->value = value;
this->next = next;
}
};
template <typename T>
class SinglyLinkedList
{
private:
Node<T> *head;
Node<T> *curr;
Node<T> *tail;
int length;
public:
SinglyLinkedList()
{
head = curr = tail = new Node<T>();
length = 1;
}
void append(T value)
{
tail->next = new Node<T>(value, NULL);
tail = tail->next;
length++;
}
void clear()
{
while (head)
{
Node<T> *temp = head;
head = head->next;
delete (temp);
}
length = 0;
}
T getValue()
{
if (curr->next == NULL)
throw runtime_error("没有元素");
return curr->next->value;
}
int getCurrPosition()
{
Node<T> *temp = head;
int i;
for (i = 0; temp != curr; i++)
{
temp = temp->next;
}
return i;
}
void insert(T value)
{
curr->next = new Node<T>(value, curr->next);
if (tail == curr)
tail = curr->next;
length++;
}
void moveToPosition(int pos)
{
if (pos < 0 || pos >= length)
{
cout << "位置有误,无法进行移动" << endl;
return;
}
curr = head;
for (int i = 0; i != pos; i++)
{
curr = curr->next;
}
}
void moveToStart()
{
curr = head;
}
void moveToEnd()
{
curr = tail;
}
void next()
{
if (curr != tail)
curr = curr->next;
}
void prev()
{
if (curr == head)
return;
Node<T> *temp = head;
while (temp->next != curr)
{
temp = temp->next;
}
curr = temp;
}
void remove()
{
if (curr->next == NULL)
{
cout << "没有元素" << endl;
return;
}
Node<T> *temp = curr->next;
if (tail = temp)
tail = curr;
curr->next = curr->next->next;
delete (temp);
length--;
}
int size()
{
return length;
}
};
int main()
{
SinglyLinkedList<int> s;
s.append(1);
s.append(2);
s.append(3);
s.append(4);
s.append(5);
s.append(6);
cout << s.size() << endl;
int index = 4;
s.moveToPosition(index);
while (index++ < s.size() - 1)
{
cout << s.getValue() << endl;
s.next();
cout << "index" << index << endl;
}
}