前言:
- 上一次青铜是做了链表反转的基本用法
- 这次是关于区间反转以及区间反转的特殊情况-两两反转问题等等链表反转的拓展问题
重点:
- 内容:链表反转的拓展问题也是高频题
要点:
1、链表反转中,可以通过头插法来对要反转的链表进行穿针引线式来进行反转。
小结:
1、指定区间反转代码:
@SuppressWarnings("all")
public class ReverseListBetween_ {
/**
* 通过头插法区间反转链表
* @param head 区间反转的链表头
* @param left 反转开始的位置
* @param left 反转结束的位置
* @return 区间反转后的链表头
* */
public ListNode reverseListBetween_(ListNode head,int left,int right){
ListNode dummyHead = new ListNode(0);
dummyHead.next = head;
ListNode pre = dummyHead;
ListNode cru = null;
ListNode temp = null;
//假设left为[1,链表的长度]
for (int i = 1; i <= left - 1; i++) {
pre = pre.next;
}
temp = pre.next;
for (int i = 0; i < right - left; i++) {
cru = temp.next;
temp.next = cru.next;
cru.next = pre.next;
pre.next = cru;
}
return dummyHead.next;
}
static class ListNode {
public int val;
public ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
}
其他/心得:
1、写代码前,在纸上分析代码时,可以先从普通情况下直接处理,然后处理好后,再倒回去想特殊情况怎么处理,可以记一些常见的特殊情况,或根据题目意思思考特殊情况,关于特殊情况的思考可以是有:
- 当区间对应的两个引用指向同一个时,会发生什么?
- 如果头结点为空怎么办?
- 因为这个区间反转的本质可以理解为插入,所以链表插入的特殊情况是有什么?
2、关于两两反转,因为两两反转的两节点相邻,所以代码可以简写,所以要结合人家结构的特点,这样代码会更简洁。