指针重指向问题
指针A 指向节点A
指针B 指向节点B
这时如果指向A改变指向,也指向了B,这时指针B并没有被覆盖而失效,指针B还在,这时相当于节点B有两个指针指向它,而节点A没有指针指向它,相当于是悬空了,此时后面的代码肯定要有个指针指向节点A
虚拟头结点
如果一条链表分隔成两个链表然后又把这两个链表又连接在一起,这时候可以用两个虚拟头结点
不要什么题目上来就用递归
class Solution {
// 返回以head为头结点的小于k的节点都在大于等于k节点的前面
public ListNode partition(ListNode head, int x) {
ListNode dummyHead1 = new ListNode(0);
ListNode dummyHead2 = new ListNode(0);
ListNode node1 = dummyHead1;
ListNode node2 = dummyHead2;
while (head != null) {
if (head.val < x) {
node1.next = head;
head = head.next;
node1 = node1.next;
node1.next = null;
} else {
node2.next = head;
head = head.next;
node2 = node2.next;
node2.next = null;
}
}
node1.next = dummyHead2.next;
return dummyHead1.next;
}
}
求中间节点,固定套路,相当于一个小工具,建议背下来,因为好多题会用到
ListNode fast = head;
ListNode slow = head;
// 下面这段代码是找链表中间结点的一般做法
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
}
// 现在slow节点就是中间节点
- 当一个节点被保存了下来,说明后续的操作肯定是围绕这个节点展开的,要么就是指向这个节点的指针会改变,要么就是这个节点指向的下一个节点会发生改变,要么就是两者都会发生!!所以这个节点刚开始必须先要保存下来,因为只有先提前保存下来,这样才能够肆无忌惮的改变这个节点上的指针!
例如:反转链表
这种解法只改变了指向这个节点的指针,并没有改变这个保存节点指向其他节点的指针
class Solution {
public ListNode reverseList(ListNode head) {
ListNode pre = null;
ListNode cur = head;
while(cur!=null){
// 这里保存了一个节点
ListNode tempNode = cur.next;
// 然后接下来就是改变指向这个节点的指针,使得这个指针不指向这个节点,让它指向其他的节点。。这里并没有改变这个保存节点指向其他节点的指针,只改变了指向这个保存节点的指针
cur.next = pre;
pre = cur;
// 不指向这个节点之后,但你总得安排个指针指向这个节点吧,不然这个节点就悬空了啊
cur = tempNode;
}
return pre;
}
}
再来一种解法:这种解法既会改变指向这个保存节点的指针,也会改变这个保存节点指向其他节点的指针!!!不过有点麻烦的是,要提前计算出这个链表的长度
class Solution {
public ListNode reverseList(ListNode head) {
if(head==null || head.next==null) return head;
ListNode dummyNode = new ListNode(-1);
dummyNode.next = head;
ListNode pre = dummyNode;
ListNode cur = dummyNode.next;
int len = length(head);
head = dummyNode.next;
while(len-->1){
ListNode tempNode = cur.next; // 保存这个节点
cur.next = tempNode.next; // 指向这个保存节点的指针立马发生改变
tempNode.next = pre.next; // 这个保存节点的指向下一个节点的指针也要发生改变
pre.next = tempNode;
}
return pre.next;
}
public int length(ListNode head){
int len = 0;
while(head!=null){
head = head.next;
len++;
}
return len;
}
}