實際上根本就不用插入,一次遍歷就可以完成了。
簡潔的做法是
遍歷鏈表,
元素進棧,
遍歷的同時銷毀原來的鏈表。
元素出棧,
建立新鏈表。
高效的是,
用指向鏈表結點指針的指針操作
直接首尾交換指針值(兩兩進行)
一般的是前插法
實際上根本就不用插入,一次遍歷就可以完成了。
鏈表的逆序,必將涉及到兩個以上指針,一般用三個指針,
下面是一個人的程序:
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;
}
算法都是一致,但順序不一樣,這直接點明了鏈表操作的核心——順序,鏈表的算法主要難在順序上。
逆序操作中,要將一個指針指向前一個節點,中間必然斷開,這就需要兩個指針指向斷開處的一前一後。
上面兩個程序都是這樣,不同在於指針移動的位置。
*