前天在论坛上看到有位同学在问链表转置的问题,下面的人不是在别的地方拷贝来的代码(还有错误),要么就是一点解释都没有
链表定义
typedef struct node
{
ElemType data;
struct node * next;
}ChainNode;
typedef struct
{
ChainNode *head;
int size;
ChainNode *tail;
}List;
/*********************************************************
总体思路就是将链表看作是两条链
每次都从旧链表里面取第一个作为新链表的表头,
*********************************************************/
void ReserveList(List * plist) //非递归实现,
{
ChainNode * phead; //新链表的头 开始的第一个节点
ChainNode * pt; //旧链表的头 开始的第二个节点
ChainNode * pn; //旧链表头的下一个
phead = plist->head;
if(phead && phead->next&& phead->next->next) //首先确定
{
phead = plist->head->next; //新链表就是以第一个节点开始,依次在表头添加节点,添加的节点是旧链表的第一个节点
pt = phead->next; //旧链表,旧链表被取走头结点之后放入新链表的表头,
pn = pt->next;
phead->next = 0;
while(pt)
{
pn = pt->next; //pn是旧链表的第二个节点
pt ->next = phead; //取旧链表的第一个节点插入新链表
phead = pt;
pt = pn; //旧链表往后移动
}
}
plist->head->next = phead; //新链表重新赋值到整个链表
}
/*********************************************************
递归思想,原理也是从就链表上依次取元素放入到新链表
直到就链表被取完,
开始的时候新链表是空的
*********************************************************/
ChainNode * ReserveListRe(ChainNode * oldlist,ChainNode * newlist)
{
ChainNode * pt;
pt = oldlist->next; //取旧链表的表头,pt是现在的旧链表
oldlist->next = newlist; //就旧链表插入到新链表
newlist = oldlist; //如果旧链表是空,表示旧链表被取完了,新链表就是翻转之后的链表
return (pt == NULL) ? newlist : ReserveListRe(pt,newlist);
}