链表常见习题练习
前言
链表类型的习题常用的技巧就是定义指针来代替head的,替head走,要么就是数学问题,环形链表就是利用数学思想取解决的,要么就是定义双指针来操作链表。
一、删除链表中给定值为key的节点
leetcode 203题
定义两个变量,一个使待删除的节点,一个为待删除节点的前驱节点,最后记得判断头节点是否为要删除的节点,最后返回头节点。
public ListNode removeElements(ListNode head, int val) {
if(head==null){
return null;
}
ListNode cur=head.next;
ListNode prev=head;
while(cur!=null){
if(cur.val==val){
prev.next=cur.next;
}else{
prev=cur;
}
cur=cur.next;
}
if(head.val==val){
head=head.next;
}
return head;
}
二、反转链表
定义双指针法,类似于头插法,来将链表的节点头插法
cur节点是待反转的节点 curNext是保存下一个节点的地址值
1.先保存待反转节点下一个地址值,之后将头节点的next置空
2.只有用头插法将节点头插即可。
leetcode 206
public ListNode reverseList(ListNode head) {
//三指针法来反转链表
if(head==null||head.next==null){
return head;
}
ListNode cur=head;//要头插的节点
ListNode curNext=head.next;//保存下一个节点的地址值
cur=curNext;
head.next=null;
while(cur!=null){
curNext=curNext.next;
cur.next=head;
head=cur;
cur=curNext;
}
return head;
}
三、返回链表的中间节点
leetcode 876
定义快慢指针,注意偶数节点和奇数节点的情况
注意判断条件 在偶数情况下 如果是判断fast.next.next就会空指针异常,必须把判断条件两个都加上。
public ListNode middleNode(ListNode head) {
//定义快慢指针 快指针比慢指针多走一步 注意奇数和偶数情况
if(head==null||head.next==null){
return head;
}
ListNode slow=head;
ListNode fast=head;
while(fast!=null&&fast.next!=null){
fast=fast.next.next;
slow=slow.next;
}
return slow;
}
四、删除链表的倒数第K个节点
leetcode 19题
定义快慢指针 快指针先走n-1步 之后慢指针再走,修改地址值即可
public ListNode removeNthFromEnd(ListNode head, int n) {
if(head==null){
return null;
}
ListNode fast=head;
ListNode dummy&#