给定一个链接的数字列表。 每2个相邻的链接交换
给定一个链接的数字列表。 每2个相邻的链接交换。 例如,如果给你的链表是:
a->b->c->d->e->f
预期产出:
b->a->d->c->f->e
每2个替代链接必须交换。
我在这里写了一个解决方案。 你能建议我一些其他的解决方案吗? 你能评论我的解决方案,并帮助我更好地写下它吗?
void SwapAdjacentNodes (Node head)
{
if (head == null) return;
if (head.next == null) return;
Node curr = head;
Node next = curr.Next;
Node temp = next.Next;
while (true)
{
temp = next.Next;
next.Next = curr;
curr.Next = temp;
if (curr.Next != null)
curr = curr.Next;
else
break;
if (curr.Next.Next!=null)
next = curr.Next.Next;
else
break;
}
}
看看这个C ++解决方案:
public void exchangeAdjElements(){
LLMain backup=current.next;
LLMain temp = current.next;
LLMain previous=current;
while(current!=null && current.next!=null){
previous.next=current.next;
current.next=temp.next;
temp.next=current;
if(current.next!=null){
previous=current;
current=current.next;
temp=current.next;
}
}
current=backup;
}
这里的电流是头节点。
下面是一个简单版本的粗略草图,假设Node有“Next”和“Data”成员:
for (Node n = head; n && n.Next; n = n.Next.Next) {
void* tmp = n.Data;
n.Data = n.Next.Data;
n.Next.Data = tmp;
}
换句话说,停止在列表中的每个其他节点,并将其数据与下一个(一个)交换。 简单。
编辑:以上解决方案交换节点内的数据,但不是节点本身。 如果你想交换实际的节点,解决方案需要更多的逻辑。
@dkamins:你正在改变价值观,但在这些类型的问题中,采访者通常会要求指针改组。
我对这个问题的尝试:
void swap (struct list **list1)
{
struct list *cur, *tmp, *next;
cur = *list1;
if(!cur || !cur->next)
return;
*list1 = cur->next;
while(cur && cur->next)
{
next = cur->next;
cur->next = next->next;
tmp = cur->next;
next->next = cur;
if(tmp && tmp->next)
cur->next = cur->next->next;
cur = tmp;
}
}
链接地址: http://www.djcxy.com/p/45921.html
上一篇: Given a linked list of numbers. Swap every 2 adjacent links