1,原理
使用p和q兩個指標配合工作,使得兩個節點間的指向反向,同時用r記錄剩下的鍊錶。
p = head;
q = head->next;
head->next = null;
現在進入迴圈體,這是第一次迴圈。
r = q->next;
q->next = p;
p = q;
q =r;
第二次迴圈。
r = q->next
q->next = p;
p = q;
q = r
第三次迴圈。。。。。
2,**實現
首先初始化乙個空的單鏈表,然後在單鏈表中依次插入1-10個元素,然後翻轉單鏈表,然後列印單鏈表.
#include#include#include#include#include#include#includestruct lnode ;
typedef struct lnode* linklist;
/*void initlist(linklist l)
l->next = null;
printf("initlist ok \n");
if(l == null) }*/
int listinsert(linklist l, int i, int e)
while(p && j < i-1)//尋找第i-1個節點
if(!p || j > i-1)
s = (linklist)malloc(sizeof(struct lnode));
s->data = e;
s->next = p->next;
//s->next = null;
p->next = s;
printf("listinsert ok \n");
return 1;
}void printlist(linklist l)
printf("\n");
}linklist reverselist(linklist l)
linklist p;
linklist q;
linklist r;
p = l;
q = l->next;
l->next = null;
while(q)
l = p;
return l;
}void main(void)
l->next = null;
printf("initlist ok \n");
if(l == null)
if(l == null)
for(j=1; j<=10;j++)
listinsert(l,j,j);
printf("在l的表尾依次插入1-10後:\n");
printlist(l);
re_l = reverselist(l->next);//remove head file .begin with first data element 從首元節點開始
printf("翻轉之後的鍊錶:\n");
//printlist(re_l);
ll = (linklist)malloc(sizeof(struct lnode));
ll->next = re_l; //add a head point 新增乙個頭節點
printlist(ll);
}
執行結果:
initlist ok
listinsert ok
listinsert ok
listinsert ok
listinsert ok
listinsert ok
listinsert ok
listinsert ok
listinsert ok
listinsert ok
listinsert ok
在l中插入1-10後:
1 2 3 4 5 6 7 8 9 10
翻轉之後的鍊錶:
10 9 8 7 6 5 4 3 2 1
單鏈表翻轉
關於單鏈表的翻轉問題頗為困擾人。下面寫的程式只需遍歷每個節點一次,並且不需要構造輔助接點 通過new的方式 另外這個問題可以轉換為乙個迴圈鍊錶結構,很有意思。h struct node class cdatastruct cpp檔案 cdatastruct cdatastruct void cdat...
單鏈表翻轉
相比之前的那個方法 206.reverse linked list 這個方法比較簡單,直接在鍊錶上面進行逆序 容易理解 此 是用於將帶頭結點的單鏈表進行逆序,思路 1.首先設p結點為第乙個有效結點 即頭結點的下乙個節點 q為p的下乙個節點,原因從後面可知。2.將所給節點從頭結點處斷開,然後讓p結點的...
單鏈表翻轉
struct listnode 1 迭代 在遍歷列表時,我們需要將當前節點的 next 指標改為指向前乙個元素 前乙個元素沒有,所以要先儲存其前乙個元素 在更改引用之前,還需要另乙個指標來儲存後乙個節點 2 就地反轉法 把當前鍊錶的下乙個節點pcur插入到頭結點dummy的下乙個節點中,就地反轉。d...