给定一个链接的数字列表。 每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

下一篇: Match over multiple lines perl regular expression