#include <iostream>
using namespace std;
class Node
{
public:
int _value;
Node* _next;
public: Node() = default; Node(int value,Node *next) :_value(value),_next(next){} }; class SingleLink { public: SingleLink(); Node* getNode(int index); Node* insert(int index, int t); Node* Head_insert(int t); Node* Last_insert(int t); Node* Del(int index); Node* Del_head(); Node* Del_last(); void pirnt(); bool IsEmpty(); int size(); private: int count; Node* phead; }; SingleLink::SingleLink() :count(0), phead(nullptr) { phead = new Node(); phead->_next = nullptr; }; Node *SingleLink::getNode(int index) { if (index > count || index < 0) //getNode 函数,当传入0 index时,返回head,传入1 index时,返回链表第一个元素。 return nullptr; int temp = 0; Node* preNode = phead; while (temp<index) { temp++; preNode = preNode->_next; } return preNode; } Node* SingleLink::insert(int index, int t) { Node* preNode = getNode(index); if (preNode) { Node* newNode = new Node(t,preNode->_next); preNode->_next = newNode; count++; return newNode; } return nullptr; } Node* SingleLink::Head_insert(int t) { return insert(0,t); } Node* SingleLink::Last_insert(int t) { return insert(count, t); } Node* SingleLink::Del(int index) { if (IsEmpty()) return nullptr; Node* ptrNode = getNode(index); //例:传入序号0,得到head头节点。 Node* delNode = ptrNode->_next; //通过得到head->next,得到要删除节点的位置 ptrNode->_next = delNode->_next; //将del->next的 位置赋予头节点的下一个位置。 count--; delete delNode; return ptrNode; } Node* SingleLink::Del_head() { return Del(0); } Node* SingleLink::Del_last() { return Del(count); } bool SingleLink::IsEmpty() { return count == 0; } void SingleLink::pirnt() { Node* prt = phead; //定义一个类指针存储phead, while (prt!=nullptr) // 每次通过prt->next移动指针,直到移动null跳出循环 { cout << prt->_value<<endl; prt = prt->_next; } } int SingleLink::size() { return count; } int main() { SingleLink* link = new SingleLink(); int a[] = {20,30,40}; for (int i=0;i<3;i++) { link->Head_insert(a[i]); } link->pirnt(); link->Del_head(); cout <<"删除头节点"<< endl; link->pirnt(); cout << "1号位置插入5" << endl; cout << endl; link->insert(1,5); link->pirnt(); }
完整代码
输出结果
Node *SingleLink::getNode(int index)
{
if (index > count || index < 0) //getNode 函数,当传入0 index时,返回head,传入1 index时,返回链表第一个元素。
return nullptr;
int temp = 0;
Node* preNode = phead;
while (temp<index)
{
temp++; preNode = preNode->_next; } return preNode; } 代码解析
这里的index指:即0为头节点,序号1为第一个节点,
Node* SingleLink::Del(int index)
{
if (IsEmpty())
return nullptr;
Node* ptrNode = getNode(index); //例:传入序号0,得到head头节点。
Node* delNode = ptrNode->_next; //通过得到head->next,得到要删除节点的位置
ptrNode->_next = delNode->_next; //将del->next的 位置赋予头节点的下一个位置。
count--;
delete delNode;
return ptrNode; }
删除代码:
当传入index 为0时,删除的为链表中除头节点的第一个节点。
如图所示。
头插法:可将一个数组插入后,顺序变为倒叙。
尾插法:为一种动态插入,随着count++的增加,每次插入的位置都为链表的最后一个位置。