从尾到头打印链表,逆置链表,链表pos位置删除元素,链表pos位置前插入一个元素
void SLitsPrintTailToHeadR(SListNode* phead)//从尾到头打印链表的递归
{
if (phead == NULL )
{
return ;
}
SLitsPrintTailToHeadR(phead->_next);
printf("%d", phead->_data);
}
通过递归实现从尾到头打印链表,递归可以把大问题分析成小问题,一直走到指针指向的是空的时候返回上一个函数过程,因此先打印最后一个然后打印倒数第二个,然后以此类推直到头指针。
同样也可以通过非递归来实现,如果想将一堆数据倒过来,可以想到通过栈来实现,栈是先进后出所以创建一个栈依次将数据进去然后出栈即可。
void SListDelNonTailNode(SListNode* pos)
{
assert(pos);
SListNode *cur;
cur = pos->_next;
pos->_data = cur->_data;
pos->_next = cur->_next;
}
删除指定位置数据这里不传入头指针的情况下也是可以删除的,直接将pos后边的数据覆盖了pos的数据然后将pos的next指向cur的next即可。
void SListInsertFrontNode(SListNode* pos, DataType x)
{
assert(pos);
SListNode *cur=NULL;
cur = BuySListNode(x);
cur->_next = pos->_next;
pos->_next = cur;
}
在pos位置前插入一个数据X,首先需要创建一个节点然后将节点的数据赋值成X,然后将pos的next给了当前新的结点,然后将pos的next指向cur
SListNode* SListReverse(SListNode* list)
{
SListNode *n1, *n2, *n3;
n1 = list;
n2 = list->_next;
n3 = n2->_next;
n1->_next = NULL;
while (n3 != NULL)
{
n2->_next = n1;
n1 = n2;
n2 = n3;
n3 = n3->_next;
}
n2->_next = n1;
list = n2;
return list;
}
将整个链表逆置过来,今天先给大家介绍一种来逆置链表的方法,当然还有其他的方法
这里是创建三个指针SListNode *n1, *n2, *n3;
三个指针中第一个指针n1指向的是当前的头指针 n1 = list;
之后的n2是头指针的下一个,n3是n2的下一个
之后将n1的next变成空,因为等逆置过来之后n1是链表的结尾他的next指向的是空。
之后需要进入循环一直到目前链表的结尾这三个指针中n3是最后一个指针,根据循环的内容就可以看出,如果n3指向空的时候说明n2在当前指针的结尾,当把n2的next指向倒数第二个指针也就是当时n1的时候就可以结束了
当函数开始的时候指针是这样的,之后将你的n1的next不再指向n2,而是指向了空,之后再将n2指向当前的n1,
之后指针变成了这个样子,
然后需要开始循环,将三个指针都往后挪一个,
n1 = n2;
n2 = n3;
n3 = n3->_next;
移动完成之后的指针是这个样子的,现在将n2的next指向n1,n2->_next = n1;然后继续开始往后移动。
移动完这一步的时候就会发现n3变成了空,这时候已经要从while循环跳出了
但是仔细看while循环然后再自己推理一下就能发现,此时的n2还没有指向前一个指针所以在while循环之后需要单独的将当前的n2再指向当前的n1,然后将当前的n2赋值给之前的头指针再返回头指针就完成了。
还有一种更容易理解的方法就是先创建一个新的空指针然后将当前链表的头指针指向这个新创建的指针,然后将第一个指向移动后的头指针。
依次指过来即可,这种方法相对于上一种方法来说更容易被人接受和理解,代码也相对简单,所以今天没有把他写出来。
图画的不好 能理解意思就好