1.链表两两交换
给你一个链表,删除链表的倒数第
n
个结点,并且返回链表的头结点。
看图做题:
class Solution {
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null ){
return head;
}
ListNode virtual_head = new ListNode(-1, head);//虚拟头
ListNode cur = virtual_head;
while(cur.next != null && cur.next.next != null){//因为两两交换,所以需要确定cur后以及后面的后面不为空值
ListNode temp = cur.next.next.next;//第三个节点
ListNode sec_node = cur.next.next;//第二个节点
ListNode fir_node = cur.next;//第一个节点
//按图进行指向操作
cur.next = sec_node;
sec_node.next = fir_node;
fir_node.next = temp;
cur = cur.next.next;
}
return virtual_head.next;
}
}
2.删除倒数第n个节点
给你一个链表,删除链表的倒数第
n
个结点,并且返回链表的头结点。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if (head.next == null){
return null;
}
ListNode vir_head = new ListNode(-1,head);
ListNode fast = vir_head;
ListNode slow = vir_head;
for (int i = 0; i < n; i++){
fast = fast.next;
}
while (fast.next != null){
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return vir_head.next;
}
}
3.链表相交
给你两个单链表的头节点
headA
和headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null
。
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode curA = headA;
ListNode curB = headB;
int lenA = 0, lenB = 0;
while (curA != null){
lenA++;
curA = curA.next;
}
while (curB != null){
lenB++;
curB = curB.next;
}
curA = headA;
curB = headB;
if (lenA < lenB){
int lenTemp = lenA;
lenA = lenB;
lenB = lenTemp;
ListNode nodeTemp = curA;
curA = curB;
curB = nodeTemp;
}
int gap = lenA - lenB;
while (gap > 0){
curA = curA.next;
gap--;
}
while (curA != null){
if(curA == curB){
return curA;
}
curA = curA.next;
curB = curB.next;
}
return null;
}
}
4.环形列表
给定一个链表的头节点
head
,返回链表开始入环的第一个节点。 如果链表无环,则返回null
。如果链表中有某个节点,可以通过连续跟踪
next
指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。如果pos
是-1
,则在该链表中没有环。注意:pos
不作为参数进行传递,仅仅是为了标识链表的实际情况。
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while (fast != null && fast.next != null){
fast = fast.next.next;//快指针走两步,慢指针走一步,若相遇,则有环。无环跳出while返回null。
slow = slow.next;
if(fast == slow){//有环,找入口方法:指针1从发现有环的点出发,指针2从head出发,相遇点为环的进入点。
ListNode index1 = fast;
ListNode index2 = head;
while (index2 != index1){
index1 = index1.next;
index2 = index2.next;
}
return index1;
}
}
return null;
}
}