利用C语言的结构体和指针链表的相关知识,自己动手敲了下实现类似链表的功能。
创建方法
实现功能是接受用户输入链表长度,自动申请内存,创建节点,形成链表,并且把链表的头指针返回,供以后使用。
这边有一个循环去创建节点,实现一些赋值接受输入等操作。因为创建节点不能每次都从头结点一路找过去,所以创建一个尾节点,一直指向链表的最后,后面插入的时候每次只要挂到尾节点的后面就可以了。挂上一个节点之后再把为节点指向刚刚挂上的那个节点,这样每次新建节点就能很快的挂到链表上。
输出链表
输出链表是从头结点开始,一直移动指针,每次完成一个节点的内容之后,再讲p指向p->next,这样就能循环遍历所有的节点了。
插入节点
这个很容易想到就是先把中间要插入节点的index前一个节点找到,再将自己的p->next指向他的下个节点,再将index的前一个节点的的p->next指向新创建的节点,这样就在index位置插入了一个新建的节点。
while循环是将指针移动到index-1的位置,这样后面我们就能利用index-1的指针进行插入操作了。第二个是排除一些异常的情况,i>index-1 是防止用户误输入,比如链表长度是5,用户输入-1 的位置插入,这样会出现异常,所以加上判断条件,拦截异常。
删除元素
删除元素的和插入元素的代码看起来很相似,其实想想也能明白,删除index位置的节点,首先要找到index-1位置的节点,并改变p->next值,并且是指向下个元素的p->next,这样才能达到删除index位置节点的功能。
判断条件和循环条件都一样,*val是返回出去的删除的节点的value值。
反转单链表
单链表反转,思路是取俩个指针,分别指向头指针和和首指针,将首指针的pNext指向头指针,循环直到第二个指针为空即到链表的尾部停止,循环的过程中不断的移动这俩个指针,并且改变指针的pNext。
循环完成之后,链表的状态应该是之前的头指针变成了尾指针,之前的尾指针变成了第一个指针,但是里面没有值,移除并释放这个节点,创建新的头结点,并指向反转过的链表的第一个节点,最后返回newHead.
网友评论