通过只调整链来交换两个相邻的元素
单链表
/*通过调整链来交换两个相邻的元素*/
/*单链表*/
#include<iostream>
using namespace std;
struct ListNode{
int value;
ListNode * pNext;
};
//单链表中ListNode的结构:
// struct ListNode {
// int val; //当前结点的值
// ListNode *next; //指向下一个结点的指针
// ListNode(int x) : val(x), next(NULL) {} //初始化当前结点值为x,指针为空
// };
void addListNode(ListNode * & p, int v){
if(NULL == p){
ListNode * pTem = new ListNode;
pTem->pNext = NULL;
pTem->value = v;
p = pTem;
}
else
addListNode(p->pNext,v);
}
// void swap(ListNode * & p){ //chang the neighboring node;
// if(NULL == p)
// return;
// ListNode * p1;
// ListNode * p2;
// p1 = p->pNext;
// p2 = p1->pNext;
// p1->pNext = p2->pNext;
// p->pNext = p2;
// p2->pNext = p1;
// }
void swap(ListNode * beforep)
{
ListNode *p , *afterp;
p = beforep->pNext;
afterp = p->pNext; // both p and afterp assumed not NULL
p->pNext = afterp-> pNext;
beforep ->pNext = afterp;
afterp->pNext = p;
}
void traverse(ListNode * p){ //traverse the list and output the value
while(NULL != p)
{
cout << p->value << " ";
p=p->pNext;
}
cout << endl;
return;
}
int main(){
ListNode * pHead = NULL;
addListNode(pHead,1);
addListNode(pHead,2);
addListNode(pHead,3);
addListNode(pHead,4);
addListNode(pHead,5);
traverse(pHead);
swap(pHead->pNext);
traverse(pHead);
return 0;
}
双链表
/*双链表*/
#include<iostream>
using namespace std;
struct ListNode{
int value;
ListNode * pNext;
ListNode * pPre;
};
ListNode * pTail;
void addListNode(ListNode * & p, int v){
if(NULL == p){
if( NULL == pTail){
ListNode * pTem = new ListNode;
pTem->pNext = NULL;
pTem->pPre = NULL;
pTem->value = v;
p = pTem;
pTail = pTem;
}
else{
ListNode * pTem = new ListNode;
pTem->pNext = NULL;
pTem->pPre = pTail;
pTem->value = v;
p = pTem;
pTail = pTem;
}
}
else
addListNode(p->pNext,v);
}
// void swap(ListNode * & p){ //chang the neighboring node;
// if(NULL == p)
// return;
// ListNode * p1;
// ListNode * p2;
// p1 = p->pNext;
// p2 = p1->pNext;
// p1->pNext = p2->pNext;
// p2->pNext->pPre = p1;
// p->pNext = p2;
// p2->pPre = p;
// p2->pNext = p1;
// p1->pPre = p2;
// }
void swap(ListNode * p)
{
ListNode *afterp, *beforep;
beforep = p->pPre;
afterp = p->pNext;
p->pNext = afterp->pNext;
beforep->pNext = afterp;
afterp->pNext = p;
p->pNext->pPre = p;
p->pPre = afterp;
afterp->pPre = beforep;
}
void traverse(ListNode * p){ //traverse the list and output the value
while(NULL != p)
{
cout << p->value << " ";
p=p->pNext;
}
cout << endl;
ListNode * p1 = pTail;
while(NULL != p1)
{
cout << p1->value << " ";
p1 = p1->pPre;
}
cout << endl;
return;
}
int main(){
ListNode * pHead = NULL;
pTail = NULL;
addListNode(pHead,1);
addListNode(pHead,2);
addListNode(pHead,3);
addListNode(pHead,4);
addListNode(pHead,5);
traverse(pHead);
swap(pHead->pNext);
traverse(pHead);
return 0;
}