简洁的做法是
遍历链表
, 元素进栈
, 遍历的同时销毁原来的链表
。 元素出栈,
建立新链表
。 高效的是,
用指向链表结点指针的指针操作
直接首尾交换指针值(两两进行)
一般的是前插法
实际上根本就不用插入,一次遍历就可以完成了。
链表的逆序,必将涉及到两个以上指针,一般用三个指针,
下面是一个人的程序:
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;
}
算法都是一致,但顺序不一样,这直接点明了链表操作的核心——顺序,链表的算法主要难在顺序上。
逆序操作中,要将一个指针指向前一个节点,中间必然断开,这就需要两个指针指向断开处的一前一后。
上面两个程序都是这样,不同在于指针移动的位置。