面试常见单链表排序问题的解法

简介

给定一个单链表的头节点,要将该链表排序. 这个问题的解法实际上有很多,这里我主要写一下快排的实现.值得注意的是,我们这里用的是值交换,并不是指针交换,对于单链表问题有时候使用值交换是非常方便的,避免了很多的指针操作.

思路

办法实际上不难,我们回忆一下快排的思路,先选取一个key,然后以key为标准,将数组划分为两个子数组,一个子数组的所有值都小于key,另一个子数组的所有值都大于等于key,然后再对这两个子数组重复之前的操作,最终整个数组都排序完成.
但是我们这里应该怎么办呢,其实思路不算难,我们先选取第一个元素作为key,当然key的选取可能有思路,但这个不是快排的重点,我们接下来保存两个指针,假设一个指针为p,一个指针为q,我们希望p当前指向的值以及在p前面的值都是小于key的,而处于p以及q之间的值都是大于等于key的,因此当q到达链表的尾端时,数组就已经分组完成了,显然这和数组快排的思路是基本一致的.

具体步骤

暂时我也不知道有什么工具可以用来画这个图,所以就手画了一哈,但是大概思路是没有问题的,希望大家理解一下.
image.png

代码实现

由于我最近都在看Java,所以为了锻炼一哈Java的代码能力,这里源码用的是Java来实现,代码如下:

public class SingleListQuickSort {
  static class Node
  {
    public int key;
    public Node next;
    public Node(int k) {
      key = k;
      next = null;
    }
    public Node(int k, Node node) {
      key = k;
      next = node;
    }
	}
	Node partition(Node begin, Node end)
	{
		if(begin == end)
			return begin;
		int key = begin.key;
		Node pNode = begin;
		Node qNode = begin.next;
		while(qNode != end)
		{
			if(qNode.key < key)
			{
				pNode = pNode.next;
				int tempKey = pNode.key;
				pNode.key = qNode.key;
				qNode.key = tempKey;
			}
			qNode = qNode.next;
		}
		int temp = begin.key;
		begin.key = pNode.key;
		pNode.key = temp;
		return pNode;
	}
	void quickSort(Node head, Node end)
	{
		if(head != end)
		{
			Node pNode = partition(head, end);
			quickSort(head, pNode);
			quickSort(pNode.next, end);
		}
	}
	void printSingleList(Node head)
	{
		while(head != null)
		{
			System.out.println(head.key);
			head = head.next;
		}
	}
	public static void main(String[] args) {
		Node head = new Node(4);
		Node node = new Node(2);
		Node node2 = new Node(5);
		Node node3 = new Node(3);
		Node node4 = new Node(7);
		Node node5 = new Node(9);
		Node node6 = new Node(0);
		Node node7 = new Node(1);
		head.next = node;
		node.next = node2;
		node2.next = node3;
		node3.next = node4;
		node4.next = node5;
		node5.next = node6;
		node6.next = node7;
		SingleListQuickSort singleListQuickSort = new SingleListQuickSort();
		singleListQuickSort.quickSort(head, null);
		singleListQuickSort.printSingleList(head);
	}
}

经过测试之后,代码也是没有问题的,欢迎各位朋友copy下来测试一下.

总结: 这次的博客比较简单,内容也不是很复杂,主要是练练手吧算是,顺便熟悉一下快排算法,不得不说快排是一个非常优秀的代码,思路非常清晰,实现起来也非常快,更好的是平均时间复杂度只有O(NlogN),可以说是个非常优秀的算法了.欢迎大家关注我的公众号:码农手札, 主要介绍Linux下的c++开发,同时介绍一些有意思的算法以及面试常见算法题的解法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值