如何写好网站开发技术文档,上海保洁服务网站建设,wordpress老文章,苏州调查公司有哪些//题目#xff1a;C实现链表逆序打印、链表反转
// 如何将链表逆序#xff0c;取决于题目的要求。如果面试官只要求打印#xff0c;一般不改动链表结构为好#xff0c;如果要求改变链表的方向#xff0c;则需要改变结构#xff0c;再顺序打印。
// 方法1#xff1a;只逆…//题目C实现链表逆序打印、链表反转
// 如何将链表逆序取决于题目的要求。如果面试官只要求打印一般不改动链表结构为好如果要求改变链表的方向则需要改变结构再顺序打印。
// 方法1只逆序打印不改变结构。采用递归到达尾结点时打印输出否则进入下一个结点的递归当递归一层层退出的时候便可以实现从尾到头的打印。
// 方法2头插法改变结构。从第二个结点开始往后依次把每个结点移至链表头部要注意最后链表不要是断裂的。
// 方法3改变指针方向。从头结点开始依次把结点的next指针断开指向该结点的前结点。要注意保存好前结点、当前结点和下一个结点。
// 方法4只逆序打印不改变结构。利用栈的后进先出来实现逆序。
//
// 注意链表为空、链表只有一个结点的情况
// 完整代码如下
#includeiostream
#include stack
using namespace std;
struct ListNode
{ int value; ListNode *next;
};
void ReversePrint(ListNode *pHead)//递归实现逆序打印不改变链表结构
{ if(pHead!NULL) { if(pHead-next!NULL) ReversePrint(pHead-next); coutpHead-value ; }
}
ListNode *ReverseList1(ListNode *pHead)//头插法改变链表结构
{ if(pHeadNULL) return NULL; ListNode *ppHead-next; ListNode *newHeadpHead; while(p!NULL) //将p结点移到链表最前方 { pHead-nextp-next;//头结点指向p的下一个结点 p-nextnewHead; //p插入链表最前方 newHeadp; //链表新头结点更新为p ppHead-next;//处理下一个结点该结点位于头结点后 } return newHead;
}
ListNode *ReverseList2(ListNode *pHead)//依次改变指针方向改变链表结构
{ ListNode *preNULL; ListNode *pNULL; while(pHead!NULL){ ppHead-next; //保存剩余链表 pHead-nextpre;//断开剩余链表头结点pHead指向pre prepHead; //pre更新 pHeadp; //head更新 } return pre;
} int main()//主函数
{ int n; cinn; //输入元素个数 ListNode* headNULL; ListNode* pNULL; ListNode* qNULL; for(int i0;in;i)//分配内存依次输入元素 { qnew ListNode; cinq-value; if(headNULL) { headq; phead; } else { p-nextq; pp-next; } } if(headNULL) return 0; p-nextNULL; //验证 cout递归逆序打印: endl; ReversePrint(head); coutendl头插法反转链表: endl; ListNode* reverseHead; reverseHead ReverseList1(head); preverseHead; while(p!NULL) { coutp-value ; pp-next; } coutendl改变指针方向反转链表将链表再次反转: endl; p ReverseList2(reverseHead); //改变指针方向反转链表 while(p!NULL) { coutp-value ; qp; pp-next; delete q;//释放内存 } coutendl; return 0;
} //方法4利用一个栈
void printListFromTailToHead(ListNode *pHead)
{ stackListNode* nodes; ListNode *ppHead; while(p!NULL) { nodes.push(p);//入栈 pp-next; } while(!nodes.empty()) { pnodes.top();//赋值 coutp-valueendl; nodes.pop();//删除栈顶元素 }
}