首页 > 编程知识 正文

从头到尾打印链表,实现单链表的反转

时间:2023-05-05 21:34:33 阅读:33518 作者:262

1、题目描述:

输入链表的开头节点,从末尾向末尾打印各节点的值。 链表定义如下:

结构列表{ int m _ nkey; ListNode* m_pNext; } 2、测试用例

功能测试(输入的链表中有多个节点; 的链表中只能输入一个节点。 )特殊输入测试(输入的链表的第一个节点指针为NULL ) http://www.Sina.com/http://www.Sina.com/:遍历链表,将链表中的所有数据排列为数组相当于两次遍历。3、解答思路:时间复杂度0(n ),空间复杂度0(n ) )。

代码如下。

void linked _ list _ reversal (listnode * head ) {int res[100]; int i=0; wile (头!=null } { RES [ I ]=头数据; head=head-next; }while(I!=0) printf('%d ',res[i--]; }printf((n ); (} 思路一)遍历链表自始至终,主题请求的输出自始至终。 也就是说,第一个遍历的节点是最后一个输出,最后一个遍历的节点是第一个输出。 实际上后退先出,类似于堆栈的操作,所以可以考虑在堆栈中实现。 遍历整个链表后,从堆栈的开头开始逐个输出节点的值。复杂度分析

voidprintlistreversingly _ iteratively (listnode * phead ) STD :3360堆栈列表节点; ListNode* pNode=pHead; wile(pnode!=nullptr(nodes.push ) ) pnode; pNode=pNode-m_pNext; } while (! nodes.empty () ) {pNode=nodes.top; printf('%dt ',pNode-m_nValue ); nodes.pop (; //注意,这里c语言中既没有堆栈,也没有推送、pop等操作,只能自己写相应的函数进行定义,过程很复杂,所以不太推荐这种方式。 堆栈定义等函数//堆栈定义typedef struct Stack{ int* arr; //堆栈的起始地址int len; //堆栈长度int top; //堆栈顶部下标}堆栈; //堆栈* create _ stack (intlen )堆栈*堆栈=malloc ) sizeof (堆栈); 堆栈- arr=malloc (siezof (int ) *len ); 堆叠- len=len; 堆叠-顶部=-1; 返回堆栈; //bool push _ stack (堆叠*堆叠,int val ) if (完整_堆叠) )返回假; 堆叠- arr [堆叠-顶部]=val; 返回真; (//bool pop _ stack (堆叠*堆叠) if ) empty_stack )返回假; 堆叠-顶部- -; 返回真; //判断堆栈是否为全bool full _ stack (堆栈*堆栈) ({返回堆栈- top1=堆栈- len; //判断堆栈是否为空bool empty _ stack (堆栈*堆栈) ) {返回堆栈- top==-1; //显示堆栈顶int top _ stack (堆栈*堆栈) if (! empty _ stack (堆栈) ) return NULL; 返回堆栈- arr [堆栈-顶部]; } 思路二:我说过堆栈实现,但实际上递归也是堆栈的操作,所以也可以使用递归来实现。 相反,要输出链表,我们每次访问一个节点时,都会递归输出后面的节点,然后输出该节点本身,从而实现链表的反转打印。复杂度分析

语音打印(列表头if )头!=NULL head-next!=null } { list print (listnode * head-next ); (if )头!=null(//空链表printf(%d(n ),头数据); (} 思路三)由于目前的学习并未详细研究时间的复杂性和空间的复杂性,因此有些地方并未标记时间的复杂性和空间的复杂性,但后期可能会添加。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。