一、链表选择排序
- void SelectSort(pLinkList list)
- {
- assert(list);
- if (NULL == list->pHead || NULL ==list->pHead->next)
- {
- return;
- }
- pLinkNode cur = list->pHead;
- pLinkNode p = NULL;
- pLinkNode min = NULL;
- while (cur!=NULL)
- {
- p = cur->next ;
- min = cur;
- while (p != NULL)
- {
- if (min->data > p->data)
- {
- min = p;
- }
- p = p->next;
- }
- if (min != cur)
- {
- DataType tmp = cur->data;
- cur->data = min->data;
- min->data = tmp;
- }
- cur = cur->next;
- }
- }
二、寻找中间结点
快慢指针是解决大多数链表问题的一个重要方法,在本题中就应用到了快慢指针,快指针fast每次走两步,慢指针slow每次走一步,等到fast走到链表尾部时,slow刚好指向中间结点。
- pLinkNode FindMindNode(pLinkList list)
- {
- assert(list);
- pLinkNode fast= list->pHead;
- pLinkNode slow = list->pHead;
- while (NULL!=fast)
- {
- if (NULL != fast->next)
- {
- fast = fast->next->next;
- slow = slow->next;
- }
- else
- {
- break;
- }
- }
- return slow;
- }
三、删除一个非尾的结点
- void EraseNotTail(pLinkNode pos)
- {
- assert(pos->next);
- pLinkNode cur = pos->next;
- pos->data = cur->data;
- pos->next = cur->next;
- free(cur);
- cur = NULL;
- }
四、删除倒数第k个结点,k大于1,小于链表长度(O(n))
这个题跟快慢指针很像,我们可以先让一个指针走k步,然后再让一个指针从起点出发,等到先走的指针到达链表尾部时,第二个指针刚好指向倒数第k个结点。
- void DelKnode(pLinkList list,int k)
- {
- assert(list);
- if (NULL == list->pHead || NULL == list->pHead->next||k<=1)
- {
- return;
- }
- pLinkNode cur = list->pHead;
- pLinkNode del= list->pHead;
- while (cur->next!=NULL)
- {
- k--;
- if (k <=0)
- {
- del = del->next;
- }
- cur = cur->next;
- }
- if (k <=0)
- {
- del->data = del->next->data;
- cur = del->next;
- del->next = cur->next;
- free(cur);
- cur = NULL;
- }
- }
五、反转链表
- void Reverselist(pLinkList list)
- {
- assert(list);
- if (NULL == list->pHead || NULL == list->pHead->next)
- {
- return;
- }
- pLinkNode newHead = NULL;
- pLinkNode tmp = NULL;
- pLinkNode cur = list->pHead;
- while (cur != NULL)
- {
- tmp = cur->next;
- cur->next = newHead;
- newHead = cur;
- cur = tmp;
- }
- list->pHead = newHead;
- }
六、在指定位置结点的前面插入一个结点
这个问题与删除一个非尾结点是一模一样的解决方法!!!
- void InsertFrontNode(pLinkNode pos, DataType x)
- {
- assert(pos);
- pLinkNode newNode=NULL;
- newNode = (pLinkNode)malloc(sizeof(LinkNode));
- if (NULL ==newNode)
- {
- printf("out of memory\n");
- exit(EXIT_FAILURE);
- }
- newNode->next = pos->next;
- pos->next = newNode;
- newNode->data = pos->data;
- pos->data = x;
- }