题目:用插入排序对链表排序
思路:建立一个新的链表,将目标链表依次插入先链表中,小就插到前面,大就插到后面,如此一来,新的链表就是目标链表按大小次序排列的了。先看第一步,将目标链表的第一个元素插入所建立的空链表,具体是先建立一个地值存下头节点的下一个节点的位置,将头节点的next变为空,连到一开始建立好的空节点上,如此一来,新的链表有了最初的一个值。方便后面的数进行比较。每一次都从新链表的头开始遍历,在后续插入中有两种情况。一是遇到比node->next->val小的数,停下遍历,将目标链表中当前的第一个数插入到node得后面;二是遍历完新链表后也没有找到比目标链表当前第一个节点的数小的数,也就是说当前目标链的第一个节点的值比新链表的所有的节点的数都要大,理应插入到新链表的最后,方法和最开始在新的空链表中插入第一个元素相同的做法。
代码:
#include<bits/stdc++.h>
using namespace std;
class ListNode
{
public:
int val;
ListNode *next;
ListNode(int val) {
this->val = val;
this->next = NULL;
}
};
class Solution
{
public:
/**
* @param head: The first node of linked list.
* @return: The head of linked list.
*/
ListNode *insertionSortList(ListNode *head)
{
// write your code here
ListNode *dummy=new ListNode(0);
while(head!=NULL)
{
ListNode *node=dummy;
while(node->next!=NULL&&node->next->val<head->val)
{
node=node->next;
}
ListNode *temp=head->next;
head->next=node->next;
node->next=head;
head=temp;
}
return dummy->next;
}
};
int main()
{
}
感想:这个题明显的体现了链表比数组好的一点,不用某些元素依次全部后移,只需要改变两个指针就可以了。插入排序这种做法仿佛开启我思考问题的另一扇门,不在原地变化,建立一个新的东西去承载这些变化,这还真是脑洞大开。也让我体会到做链表题的多变性。
链表倒数第n个节点