遍历链表,
元素进栈,
遍历的.同时销毁原来的链表。
元素出栈,
建立新链表。
高效的是,
用指向链表结点指针的指针 *** 作
直接首尾交换指针值(两两进行)
一般的是前插法
实际上根本就不用插入,一次遍历就可以完成了。
链表的逆序,必将涉及到两个以上指针,一般用三个指针,
下面是一个人的程序:
struct List1 *reverse(List1 *h) //h为链表的头指针
{
struct List1 *p,*v1,*v2
v2=h
v1=NULL
while( v2!=NULL ){
p=v2->pNext
v2->pNext=v1
v1=v2
v2=p
}
return v1
}
另一个人的:
struct IntNode* res(struct IntNode* h)
{
struct IntNode *s, *s1
s = h
h = NULL
while (s)
{
s1 = s
s = s->next
帆核 s1->next = h
h = s1
}
return h
}
算法都是一致,但顺序不一样,这直接点明了链表 *** 作的核态宴掘心——顺序,祥晌链表的算法主要难在顺序上。
逆序 *** 作中,要将一个指针指向前一个节点,中间必然断开,这就需要两个指针指向断开处的一前一后。
上面两个程序都是这样,不同在于指针移动的位置。
扣着的是头节点(头子)
车是首节点(首子)
马是次节点(次子)
牙签细的是指针指向,香头发黑的是指向,铁头细的是指向。
根轮拦据步骤写程序的伪算法(3步4循环,7张图片搞定),如下:
以下是while循环(条件:香头指向不为空)
第一个循环把马弄到车前面,
第二个循环把相弄到马前面
第三个循环把士弄到相前面
........
直到香指向为空后停止循环。
代码如下:只需要一个首结点pHead,就能把链表找到,并倒置。具体代码如下
p香=pHead->pNext
p铁=p香->pNext
p香->pNext=NULL
P香=p铁
while(p香 !=NULL)
{
p铁=p香->pNext
p香->pNext=pHead->pNext
pHead->pNext=p香;
p香=p铁;
}
对照伪算法(三步四循环),和上面的代码是一一对应的:
第一步:香头指向首子,铁头指向次子
第二步:删掉首子指向次子(铁头所指向的那个子)的牙签
第三步:香头跟着铁头
以下循环条件:(条件:香头指向不为空)
{
循环1:铁头移动到香头的下一个指向
循环2:香头的下一个指向首子
循环3:头子的下一个跟着香头
循环4:香头跟着铁头
}
自己用道具 *** 作几遍,然后把流程背会,以后自纯扒己根据腊裤胡流程写代码即可。
循环链表,把头尾接走来就行tail->next
=
head
判定是否到达尾部,1.设置计数;2.判断下一个指针圆慎敬是否是head
逆序输出
1.重新开辟空间,建立逆序链表
2.建立双向链表,即增加
pre指针指向前一个
3.如果只是要逆序输出,调用递归算法
逆序输出(
链橘慎孝谨表
)
{
if
下一个是否为空
输出
else
逆序输出(
next
)
end
输出
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)