反转链表 II
leetcode 92 题
这道题就是反转区间链表,典中典
思路就是记录区间的前驱节点和后继节点,以及区间的左右边界
记录四个位置,之后进行拼接 将前驱节点和区间右边界相连,区间左边界和后继节点相连实现区间反转链表!
public ListNode reverseBetween(ListNode head, int left, int right) {
ListNode dummy=new ListNode(-1);
dummy.next=head;
ListNode prev=dummy; //待反转区间的前驱节点
for(int i=1;i<left;i++){
prev=prev.next;
}
ListNode leftNode=prev.next; //反转前左边界
ListNode rightNode=prev;
for(int i=0;i<right-left+1;i++){
rightNode=rightNode.next;
}
//找到了反转前的右边界
ListNode tail=rightNode.next;
//先进行切断连接,再反转,重新穿针引线
prev.next=null;
rightNode.next=null;
reverse(leftNode);
//拼接 将前驱节点拼接到反转后左边
prev.next=rightNode;
//将 反转链表右边界和 链表的尾部拼接
leftNode.next=tail;
return dummy.next;
}
public void reverse(ListNode head){
if(head==null||head.next==null){
return ;
}
ListNode cur=head;
ListNode curNext=head.next;
head.next=null;
cur=curNext;
while(cur!=null){
curNext=curNext.next;
cur.next=head;
head=cur;
cur=curNext;
}
}
排序链表
leetcode 148 题
模拟归并排序进行链表排序,都是找到中间节点将链表无限划分,最后和并两个链表
public ListNode sortList(ListNode head) {
//模拟归并排序 来排序
if(head==null||head.next==null){
return head;
}
ListNode fast=head.next;
ListNode slow=head;
//利用快慢指针来 找到中间节点
while(fast!=null&&fast.next!=null){
fast=fast.next.next;
slow=slow.next;
}
ListNode mid=slow.next;
//分为两部分链表 并断开 递归调用
slow.next=null;
ListNode dummy=new ListNode(-1);
ListNode res=dummy;
ListNode left=sortList(head);
ListNode right=sortList(mid);
while(left!=null&&right!=null){
if(left.val<=right.val){
dummy.next=left;
left=left.next;
}else{
dummy.next=right;
right=right.next;
}
dummy=dummy.next;
}
dummy.next=left!=null?left:right;
return res.next;
}
对链表进行插入排序
leetcode 147题
利用插入排序的思想,认为第一个是有序的,从第二个节点为待插入的节点,定义前驱节点,
1.将有序节点的最后一个指向待插入节点的Next
2.将待插入节点的Next指向合适的位置
3.将前驱节点指向新插入的节点
public ListNode insertionSortList(ListNode head) {
//模拟进行插入排序
if(head==null||head.next==null){
return head;
}
ListNode dummy=new ListNode(0);
dummy.next=head;
ListNode pre;
while(head!=null&&head.next!=null){
if(head.val<=head.next.val){
head=head.next;
continue;
}
pre=dummy;
//给插入节点找到合适为插入位置
while(pre.next.val<=head.next.val){
pre=pre.next;
}
ListNode cur=head.next;//记录要插入的节点
head.next=cur.next;
cur.next=pre.next;
pre.next=cur;
}
return dummy.next;
}