单链表总结:
首先就是指针的问题,就算new出新指针tmp做临时变量,对tmp的改变会同时改掉原指针,因为它们本身指向同一内存地址。所以对链表的操作,一定要注意指针的操作顺序。
对链表的逆序,注意添加头结点,会是操作方便很多
nlogn的排序有快速排序、归并排序、堆排序。
双向链表用快排比较适合,堆排序也可以用于链表,单向链表适合用归并排序
技巧:
- 添加头指针,再进行操作,更加方便。
- 使用快慢指针可以用来找到链表的中间点,慢指针一次走一步,快指针一次走两步
//链表的逆序
public static ListNode reverse(ListNode head)
{
ListNode node = new ListNode(0);
//表示头指针,方便翻转
node.next = head;
ListNode tmp,current;
tmp = current =head;
while (tmp.next != null)
{
current = tmp.next;
tmp.next = current.next;
current.next = node.next;
node.next = current;
//注意操作指针的顺序,避免丢失数据
}
return node.next;
}
单链表递归合并
public static ListNode sortList(ListNode head)
{
if (head==null || head.next == null)
return head;
ListNode prev=null,slow=head,fast=head;
//快慢指针找到中间节点,慢的走一步,快的走两步,当快的到达最后,慢的会在中间
while (fast != null && fast.next != null)
{
prev = slow;
slow = slow.next;
fast = fast.next.next;
}
prev.next = null; //进行分割
ListNode left = sortList(head); //递归前半段排序
ListNode right = sortList(slow); //递归后半段排序
return merge(left,right);
}