单链表交换任意两个元素(不包括表头)
2010-07-08 15:59
330 查看
面试题
思路:
假设交换A,B,那么交换A和B的next指针,以及AB直接前驱的next指针;
特殊情况是AB相邻,做特殊处理即可。
struct node
{
int data;
node* next;
};
// find the previous node of p in the singly linked list head
node* FindPre(node*head, node*p)
{
node*q = head;
while(q)
{
if(q->next == p)
{
return q;
}
else
{
q = q->next;
}
}
return NULL;
}
// swap the two nodes p & q in the singly linked list head
// Pre-condition: p, q are not head of the list
node* swap(node*head, node*p, node*q)
{
if ( head == NULL || p == NULL || q == NULL )
{
cout<<"invalid parameter: NULL"<<endl;
return head;
}
// P->Q
if (p->next == q)
{
node* pre_p = FindPre(head, p);
pre_p->next = q;
p->next = q->next;
q->next = p;
}
else if (q->next == p)// Q->P
{
node* pre_q = FindPre(head, q);
pre_q->next = p;
q->next = p->next;
p->next = q;
}
else if ( p != q)
{
node* pre_p = FindPre(head, p);
node* pre_q = FindPre(head, q);
node* after_p = p->next;
// node* after_q = q->next;
p->next = q->next; // p->after_q
q->next = after_p; // q->after_p
pre_p->next = q; // pre_p->q
pre_q->next = p; // pre_q->p
}
return head;
}
思路:
假设交换A,B,那么交换A和B的next指针,以及AB直接前驱的next指针;
特殊情况是AB相邻,做特殊处理即可。
struct node
{
int data;
node* next;
};
// find the previous node of p in the singly linked list head
node* FindPre(node*head, node*p)
{
node*q = head;
while(q)
{
if(q->next == p)
{
return q;
}
else
{
q = q->next;
}
}
return NULL;
}
// swap the two nodes p & q in the singly linked list head
// Pre-condition: p, q are not head of the list
node* swap(node*head, node*p, node*q)
{
if ( head == NULL || p == NULL || q == NULL )
{
cout<<"invalid parameter: NULL"<<endl;
return head;
}
// P->Q
if (p->next == q)
{
node* pre_p = FindPre(head, p);
pre_p->next = q;
p->next = q->next;
q->next = p;
}
else if (q->next == p)// Q->P
{
node* pre_q = FindPre(head, q);
pre_q->next = p;
q->next = p->next;
p->next = q;
}
else if ( p != q)
{
node* pre_p = FindPre(head, p);
node* pre_q = FindPre(head, q);
node* after_p = p->next;
// node* after_q = q->next;
p->next = q->next; // p->after_q
q->next = after_p; // q->after_p
pre_p->next = q; // pre_p->q
pre_q->next = p; // pre_q->p
}
return head;
}
相关文章推荐
- 交换单链表中任意两个元素(不包括表头)
- 程序员面试题目总结--链表(7)【实现单链表交换任意两个元素(不包括表头)】
- 7单链表交换任意两个元素(不包括表头)
- 7,单链表交换任意两个元素(不包括表头)
- 如何实现单链表任意两个元素交换(不包括表头)
- 建立单链表并交换表中任意两个元素
- 如何实现单链表交换任意两个元素(不包括头结点)
- 【学习点滴-数据结构-单链表】交换单链表中任意两个元素
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 交换任意两个元素进行排序进行的最小交换次数
- 有两个序列a,b,大小都有n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b无素的和]之间的差最大。
- 【华为】题目:有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求: 通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小。
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和
- [微软]有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- [微软]有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
- 数据结构:交换单链表中的任意两元素--C实现
- 【LeetCode91-100】编码种数,逆转单链表,IP地址转化,中序遍历二叉树,生成二叉搜索树,计算二叉树个数,交叉string【hard】,判断二叉搜索树是否合法,恢复二叉树(有两个元素被交换)
- 《数组-规划》 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- 【算法题】交换单链表任意两个元素