- 利用输入构造链表?
while(cin>>val)
if(cin.get()=='\n')
- 清空链表?
从头到尾清空 - 在位置x处前插节点?
需要获取位置x的前一个节点指针 - 删除节点?
要获取待删除节点的前一个节点指针 - 反转链表?
https://www.cnblogs.com/byrhuangqiang/p/4311336.html - 反向打印链表可以使用
stack
结构
#include <iostream>
using namespace std;
typedef struct ListNode
{
int m_val;
ListNode* m_pNext;
ListNode(int _val = 0) :m_val(_val), m_pNext(nullptr) {};
}*PListHead,*PCurNode;
PListHead CreatList();
void Traverse(PListHead l);
void InsertNode(PListHead l, int val, int pos = 1);
void DeleteNode(PListHead l, int val);
bool IsFind(PListHead l, int val);
PCurNode GetPreNode(PListHead l, int val);
void ReverseList(PListHead l);
void PrintReverseList(PListHead list)
int main()
{
PListHead pHead = CreatList();
Traverse(pHead);
InsertNode(pHead, 10);
Traverse(pHead);
InsertNode(pHead, 20, 2);
Traverse(pHead);
cout << "删除节点10:" << endl;
DeleteNode(pHead, 10);
Traverse(pHead);
cout << "反转链表" << endl;
ReverseList(pHead);
Traverse(pHead);
system("pause");
return 0;
}
PListHead CreatList()
{
PListHead head = new ListNode;
PCurNode traNode = head;
int val = 0;
cout << "Input data(Enter to quit) to creat List:" << endl;
while (cin >> val)
{
PCurNode node = new ListNode;
node->m_val = val;
node->m_pNext = nullptr;
traNode->m_pNext = node;
traNode = node;
if(cin.get() == '\n')
break;
}
return head;
}
void Traverse(PListHead l)
{
PCurNode traNode = l->m_pNext;
while (traNode != nullptr)
{
cout << traNode->m_val << " ";
traNode = traNode->m_pNext;
}
cout << endl;
}
void InsertNode(PListHead l, int val, int pos)
{
PCurNode cur = l->m_pNext;
PCurNode pre = l;
for (int i = 1; i < pos; i++)
{
pre = cur;
cur = cur->m_pNext;
}
PCurNode newNode = new ListNode;
newNode->m_val = val;
newNode->m_pNext = nullptr;
pre->m_pNext = newNode;
newNode->m_pNext = cur;
}
void DeleteNode(PListHead l, int val)
{
if (!IsFind(l, val))
{
cout << "没有找到要删除的节点" << endl;
}
PCurNode pre = GetPreNode(l, val);
PCurNode cur = pre->m_pNext;
PCurNode next = cur->m_pNext;
pre->m_pNext = next;
delete cur;
}
bool IsFind(PListHead l, int val)
{
PCurNode tra = l->m_pNext;
while (tra)
{
if (tra->m_val == val)
return true;
}
return false;
}
PCurNode GetPreNode(PListHead l, int val)
{
if (!IsFind(l, val))
{
cout << "没有该节点" << endl;
}
PCurNode traNode = l;
PCurNode pre = l;
while (traNode->m_pNext)
{
if (traNode->m_pNext->m_val == val)
{
pre = traNode;
}
traNode = traNode->m_pNext;
}
return pre;
}
void ReverseList(PListHead l)
{
if (l == nullptr || l->m_pNext == nullptr)
return;
PCurNode head = l;
PCurNode cur = head->m_pNext->m_pNext;
PCurNode pre = head->m_pNext;
while (cur)
{
pre->m_pNext = cur->m_pNext;
cur->m_pNext = head->m_pNext;
head->m_pNext = cur;
cur = pre->m_pNext;
}
l = head;
}
void PrintReverseList(PListHead list)
{
if (list == nullptr || list->m_pNext == nullptr)
return;
stack<ListNode* > nodes;
PCurNode traNode = list->m_pNext;
while (traNode != nullptr)
{
nodes.push(traNode);
traNode = traNode->m_pNext;
}
while (!nodes.empty())
{
traNode = nodes.top();
nodes.pop();
cout << traNode->m_value << " ";
}
cout << endl;
}