2013-10-25 138 views
0

我一直在挣扎几个小时,结束了这个问题。我的目标是仅使用指针对链表进行排序(我不能将链表放入vec或数组中,然后进行排序)。我得到了指向列表头节点的指针。我可以调用指针的唯一方法是head-> next(next node)和head-> key(存储在节点中的int值,用于比较)。我一直在过度使用我的白板,并尝试几乎所有我能想到的东西。排序链接列表C++与指针

Node* sort_list(Node* head) 
{ 
    Node* tempNode = NULL; 
    Node* tempHead = head; 
    Node* tempNext = head->next; 

    while(tempNext!=NULL) { 

     if(tempHead->key > tempNext->key) { 
      tempNode = tempHead; 
      tempHead = tempNext; 
      tempNode->next = tempNode->next->next; 
      tempHead->next = tempNode; 
      tempNext = tempHead->next; 
      print_list(tempHead); 


     } 
     else { 
      tempHead = tempHead->next; 
      tempNext = tempNext->next; 

     } 
    } 
    return head; 
} 
+0

发布您正在尝试修复的代码。我们不介意读者 - 没有看到您尝试过的内容,就没有办法提供帮助。 – Yuushi

+0

你有什么尝试?你在找人为你写代码吗? – edtheprogrammerguy

+0

[code](http://pastebin.com/af3Npif4) 对不起,我发贴时忘了粘贴我的代码。过去5个小时我尝试了很多东西。如果你批评我的代码,那很好,但一般的想法也有帮助。 print_list方法接受一个节点并将其中的节点打印到列表的末尾。 – dclark

回答

2

因为它是一个单向链表,我们可以这样做:(伪代码)

bool unsorted = true; 
while(unsorted) { 
    unsorted = false; 
    cur = head;   

    while(cur != nullptr) { 
     next = cur->next; 
     if(next < cur) { 
      swap(cur, next) 
      unsorted = true; 
     } 

     cur = cur->next; 
    }  
} 
+0

我试过你的代码(很确定我几个小时前做过类似的事情)。如果我输入5 4 3 2 1进行排序并返回头部,仍然返回5 4 3 2 1. [code](http://pastebin.com/gLaGMXvC) – dclark

+1

@ user2113277。链接中的“代码”不会执行外部while循环,因为您已将排序集设置为“false”。它直接到代码的最后。 – Ares

0

假定这样的节点:

struct Node 
{ 
    Node *next; 
    int key; 
    Node(int x) : key(x), next(NULL) {} 
}; 

使用插入排序算法来排序列表:

Node* sort_list(Node* head) 
{ 
    Node dumy_node(0); 
    Node *cur_node = head; 

    while (cur_node) 
    { 
     Node *insert_cur_pos = dumy_node.next; 
     Node *insert_pre_pos = NULL; 

     while (insert_cur_pos) 
     { 
      if (insert_cur_pos->key > cur_node->key) 
       break; 

      insert_pre_pos = insert_cur_pos; 
      insert_cur_pos = insert_cur_pos->next; 
     } 

     if (!insert_pre_pos) 
      insert_pre_pos = &dumy_node; 

     Node *temp_node = cur_node->next; 

     cur_node->next = insert_pre_pos->next; 
     insert_pre_pos->next = cur_node; 

     cur_node = temp_node; 
    } 

    return dumy_node.next; 
} 
0

Don不会感觉不好,这比听起来要困难得多。如果这是在一个数组中,它会相当容易。如果列表是双重链接的,那将更容易。看看这个代码,它实现了一个插入排序

struct Node { 
    int key; 
    Node *next; 
    } *NodePtr; 

// do a simple selection sort http://en.wikipedia.org/wiki/Selection_sort 
Node* sort_list(Node* head) { 
    Node *top = nullptr; // first Node we will return this value 
    Node *current = nullptr; 
    bool sorted = false; 
    while (sorted == false) { 
     // we are going to look for the lowest value in the list 
     Node *parent = head; 
     Node *lowparent = head; // we need this because list is only linked forward 
     Node *low = head; // this will end up with the lowest Node 
     sorted = true; 
     do { 
      // find the lowest valued key 
      Node* next = parent->next; 
      if (parent->key > next->key) { 
       lowparent = parent; 
       low = next; 
       sorted = false; 
       } 
      parent = parent->next; 
      } while (parent->next != nullptr); 
     if (current != nullptr) { // first time current == nullptr 
      current->next = low; 
      } 
     // remove the lowest item from the list and reconnect the list 
     // basically you are forming two lists, one with the sorted Nodes 
     // and one with the remaining unsorted Nodes 
     current = low; 
     if (current == head) { head = current->next; } 
     lowparent->next = low->next; 
     current->next = nullptr; 
     if (top == nullptr) { 
      top = current; 
      } 
     }; 
    current->next = head; 
    return top; 
    } 

int _tmain(int argc, _TCHAR* argv []) { 
    Node nodes[4]; 
    nodes[0].key = 3; 
    nodes[1].key = 4; 
    nodes[2].key = 5; 
    nodes[3].key = 1; 

    nodes[0].next = &nodes[1]; 
    nodes[1].next = &nodes[2]; 
    nodes[2].next = &nodes[3]; 
    nodes[3].next = nullptr; 

    auto sortedNodes = sort_list(&nodes[0]); 

    return 0; 
    } 
0

,因为它是处理链接结构的最简单的方法使用递归方法:

伪代码:

SORT(head) 
if (head->next == null) 
    return 
tempNode = head->next 
SORT(tempNode) 
if (tempNode->value < head->value) 
    SWAP(head, tempNode) 
    SORT(head) 
return 

所以假设您有5 4 3 2 1

1)5 4 3 1 2

2)5 4 1 3 2

3)5 4 1 2 3

4)5 1 4 2 3

5)5 1 2 4 3

...

n)1 2 3 4 5

+0

什么是返回? – Ares

+0

它不会返回任何东西,我认为SORT是一个'void'类型。因此它不会返回任何东西,因为它只是交换价值。 –

0
int swapNode(node * &first, node * &second) 
{ 
    //first we will declare the 
    //previous of the swaping nodes 
    node *firstprev=NULL; 
    node*secprev=NULL; 
    node*current=head; 
    //set previous first 
    while(current->next!=first) 
    { 
     current=current->next; 
    } 
    firstprev=current; 
    //seting 2nd previous 
    while(current->next!=second) 
    { 
     current=current->next; 
    } 

// swap datas, assuming the payload is an int: 
int tempdata = first->data; 
first->data = second->data; 
second->data = tempdata; 
//swaping next of the nodes 
firstprev->next=second; 
secprev->next=first; 
}