最常见的程序员面试题(1)单链表反向
来源:互联网 发布:炉石传说盒子数据在哪 编辑:程序博客网 时间:2024/06/13 03:56
一个单链表如何反向? 在不增加额外链表对象的情况下。仔细的分析这个题目可以知道: 一个N长度的链表反向需要N次循环,也就是每次循环要改变一个next指针的值。同时,为了让循环能继续,当前的cur->next指针要保存下来,作为下次运行的cur指针。在用一个指针来保存反向后,新的next指针要指向的位置。
分别用C++和Java来实现。
- #include "stdafx.h"
- struct node{
- int data;
- node* pNext;
- explicit node(int i)
- :data(i),pNext(nullptr){}
- ~node(){if(pNext)delete pNext;}
- };
- struct sl{
- node* pHead;
- node* pTail;
- sl():pHead(nullptr),pTail(nullptr){}
- ~sl(){if(pHead)delete pHead;}
- void append(node* ps){
- if(nullptr==pHead){
- pHead=ps;
- pTail=ps;
- }
- else{
- pTail->pNext=ps;
- pTail=ps;
- }
- }
- void display(){
- node* pCur=pHead;
- while(pCur){
- printf("%d\n",pCur->data);
- pCur=pCur->pNext;
- }
- }
- void revert(){
- node* pCur=pHead;
- if(pCur==pTail)return;
- pTail=pHead;
- node* pNext=nullptr;
- while(pCur){
- node* pPrev = pCur->pNext;
- pCur->pNext = pNext;
- if(pPrev==nullptr)break;
- pNext=pCur;
- pCur =pPrev;
- }
- pHead = pCur;
- }
- };
- int _tmain(int argc, _TCHAR* argv[])
- {
- sl list1;
- list1.append(new node(2));
- list1.append(new node(6));
- list1.append(new node(8));
- list1.append(new node(7));
- list1.append(new node(5));
- list1.display();
- printf("reverted\n");
- list1.revert();
- list1.display();
- return 0;
- }
#include "stdafx.h"struct node{int data;node* pNext;explicit node(int i):data(i),pNext(nullptr){}~node(){if(pNext)delete pNext;}};struct sl{node* pHead;node* pTail;sl():pHead(nullptr),pTail(nullptr){}~sl(){if(pHead)delete pHead;}void append(node* ps){if(nullptr==pHead){pHead=ps;pTail=ps;}else{pTail->pNext=ps;pTail=ps;}}void display(){node* pCur=pHead;while(pCur){printf("%d\n",pCur->data);pCur=pCur->pNext;}}void revert(){node* pCur=pHead;if(pCur==pTail)return;pTail=pHead;node* pNext=nullptr;while(pCur){node* pPrev = pCur->pNext;pCur->pNext = pNext;if(pPrev==nullptr)break;pNext=pCur;pCur =pPrev;}pHead = pCur;}};int _tmain(int argc, _TCHAR* argv[]){sl list1;list1.append(new node(2));list1.append(new node(6));list1.append(new node(8));list1.append(new node(7));list1.append(new node(5));list1.display();printf("reverted\n");list1.revert();list1.display();return 0;}
- public class RevertList {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- RevertList.list li=new RevertList.list();
- li.append(2);
- li.append(3);
- li.append(5);
- li.append(6);
- li.append(10);
- li.display();
- System.out.println("================");
- li.revert();
- li.display();
- }
- static class node{
- int data;
- node next;
- node(int d){
- data=d;
- next=null;
- }
- }
- static class list{
- node pHead;
- node pTail;
- list(){
- pHead=pTail=null;
- }
- void append(int n){
- if(null==pHead){
- pHead=new node(n);
- pTail=pHead;
- }
- else{
- pTail.next=new node(n);
- pTail=pTail.next;
- }
- }
- void display(){
- node Cur=pHead;
- while(Cur!=null){//?
- System.out.println( "=" + Cur.data );
- Cur=Cur.next;
- }
- }
- void revert(){
- node Cur=pHead;
- if(Cur==pTail){
- return;
- }
- pTail=pHead;
- node Revert=null;
- while(Cur!=null){
- node Next=Cur.next;
- Cur.next=Revert;
- if(Next==null)break;
- System.out.println("inside revert");
- Revert=Cur;
- Cur=Next;
- }
- pHead=Cur;
- }
- }
- }
public class RevertList {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubRevertList.list li=new RevertList.list();li.append(2);li.append(3);li.append(5);li.append(6);li.append(10);li.display();System.out.println("================");li.revert();li.display();}static class node{int data;node next;node(int d){data=d;next=null;}}static class list{node pHead;node pTail;list(){pHead=pTail=null;}void append(int n){if(null==pHead){pHead=new node(n);pTail=pHead;}else{pTail.next=new node(n);pTail=pTail.next;}}void display(){node Cur=pHead;while(Cur!=null){//?System.out.println( "=" + Cur.data );Cur=Cur.next;}}void revert(){node Cur=pHead;if(Cur==pTail){return;}pTail=pHead;node Revert=null;while(Cur!=null){node Next=Cur.next;Cur.next=Revert;if(Next==null)break;System.out.println("inside revert");Revert=Cur;Cur=Next;}pHead=Cur;}}}
- 最常见的程序员面试题(1)单链表反向
- 最常见的程序员面试题(10)字符串的处理
- 最常见的程序员面试题(2)二叉树逐层打印
- 最常见的程序员面试题(3)置换算法
- 最常见的程序员面试题(7)二叉树转链表
- 最常见的程序员面试题(8)常见的几种递归和堆栈问题
- 最常见的程序员面试题(6)计算最常用的URL地址
- 最常见的php面试题
- 常见程序员面试题
- 最常见的程序员面试题(4)写一个能工作的Singleton
- 最常见的程序员面试题(9)求和/求极值的问题
- 最常见的程序员面试题(5)Java/C++线程同步
- 最常见的程序员面试题(12)观察者模式和weak_ptr
- 单链表的常见面试题1
- java最常见面试题
- Javascript程序员常见面试题
- 面试题:最常见最有可能考到的C语言面试题汇总
- 最常见的程序员面试题(11)排序二叉树的序列化和反序列化
- Class.forName()的资料搜集
- 2012来了,IT还得发展
- 读《哥德尔,艾舍尔,巴赫-集异壁之大成》
- web前端网站优化-你真的不重要了吗?
- Oracle SQL 字符串操作
- 最常见的程序员面试题(1)单链表反向
- Spring Extension (2) — Annotation RequestAttribute for Controller method Parameter Injection
- CFString去掉string中的字符串(空格)
- 一个有趣的Javascript波浪特效
- openstack实际应用中问题总结
- 最常见的程序员面试题(2)二叉树逐层打印
- The Quiz(http://dmitrysoshnikov.com/ecmascript/the-quiz/#q9)
- 最常见的程序员面试题(3)置换算法
- 最常见的程序员面试题(4)写一个能工作的Singleton