从尾到头打印单链表
几种方法:
1)头插法打印;将原有单链表进行头插,在将其新的链表打印出来(会重新开辟空间,故不建议这种做法)
2)递归法打印;当递归到链表的尾时,返回,并打印链表的数据
3)循环法打印;(过程如下图)
代码:
/*头插法*/
void SListPrintBackToFront(SListNode* pHead)
{
assert(pHead);
//头插
SListNode*cur = pHead;
list = NULL;
while (cur)
{
SListPushFront(&list, cur->_data);
cur = cur->_next;
}
SListPrint(list);
}
递归:
/*递归*/
void SListPrintBackToFront1(SListNode* pHead)
{
if (pHead == NULL)
return;
if (pHead->_next != NULL)
{
SListPrintBackToFront1(pHead->_next);
}
printf("%d ", pHead->_data);
}
循环:
/*循环*/
void SListPrintBackToFront2(SListNode* pHead)
{
SListNode* cur = NULL;
SListNode* tail = NULL;
if (pHead == NULL)
{
return;
}
while (tail != pHead)
{
cur = pHead;
while (cur->_next != tail)
{
cur = cur->_next;
}
printf("%d ", cur->_data);
tail = cur;
}
}
删除一个无头单链表的非尾节点
替换法删除(具体过程如下图)
代码:
/*替换法删除*/
void SListDeleteNode(SListNode **ppHead, SListNode* pos)
{
assert(*ppHead);
SListNode* next = pos->_next;
pos->_data = next->_data;
pos->_next = next->_next;
free(next);
}
在无头单链表的一个节点前插入一个节点(不能遍历链表)
尾插交换数据法插入(具体过程如下图)
代码:
//在无头单链表的一个节点前插入一个节点(不能遍历链表)
void Swap(DataType* x, DataType* y)
{
DataType tmp = *x;
*x = *y;
*y = tmp;
}
void SListPushNode(SListNode **ppHead, SListNode* pos,DataType x)
{
assert(*ppHead);
assert(pos);
//在pos的后面尾插节点
SListNode* NewNode = BuySListNode(x);
NewNode->_next = pos->_next;
pos->_next = NewNode;
Swap(&pos->_data, &NewNode->_data);
}