一个单链表如何反向? 在不增加额外链表对象的情况下。仔细的分析这个题目可以知道: 一个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 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;
}
}
}