您的位置:首页 > 其它

用递归和非递归两种方法翻转一个链表

2014-09-13 14:55 183 查看
先定义一下链表:

[cpp] view
plaincopy

typedef struct node

{

ElemType data;

struct node * next;

}ListNode;

typedef struct

{

ListNode *head;

int size;

ListNode *tail;

}List;

/*********************************************************

非递归的翻转实际上就是使用循环,依次后移指针,

并将遇到的链表指针反转

*********************************************************/

void ReserveList(List * plist) //非递归实现,

{

ListNode * phead; //新链表的头 开始的第一个节点

ListNode * pt; //旧链表的头 开始的第二个节点

ListNode * 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; //新链表重新赋值到整个链表

}

/*********************************************************

递归思想,原理也是从就链表上依次取元素放入到新链表

直到原始链表被取完,得到新链表

*********************************************************/

ListNode * ReserveListRe(ListNode * oldlist,ListNode * newlist)

{

ListNode * pt;

pt = oldlist->next; //取旧链表的表头,pt是现在的旧链表

oldlist->next = newlist; //就旧链表插入到新链表

newlist = oldlist; //如果旧链表是空,表示旧链表被取完了,新链表就是翻转之后的链表

return (pt == NULL) ? newlist : ReserveListRe(pt,newlist);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐