- 24. 两两交换链表中的节点
设置虚拟头结点
cur为虚拟头结点 temp firstnode secondnode三个临时节点
先令cur指向cur.next.next
令cur.next.next指向cur.next
令cur.next指向cur.next.next.next
循环往复
cur从虚拟头结点开始每次移动一位
循环终止条件为cur.next &&cur.next.next 为空时
ListNode dumyhead = new ListNode(-1); // 设置一个虚拟头结点
dumyhead.next = head; // 将虚拟头结点指向head,这样方面后面做删除操作
ListNode cur = dumyhead;
ListNode temp; // 临时节点,保存两个节点后面的节点
ListNode firstnode; // 临时节点,保存两个节点之中的第一个节点
ListNode secondnode; // 临时节点,保存两个节点之中的第二个节点
- 19.删除链表的倒数第N个节
遍历两遍也可以实现,但是要设置虚拟头结点,不然无法处理这种情况,这种情况还要单独处理。我这里没有设置虚拟头结点就出错了
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
int i = 0;
ListNode cur = head;
if (head == null){
return null;
}
while(cur != null){
i++;
cur = cur.next;
}
ListNode cur1 = head;
int j = 1;
while(cur1 != null){
j++;
if (j == i - n + 1){
cur1.next = cur1.next.next;
}
cur1 = cur1.next;
}
return head;
}
}
双指针的思想,令快慢指针相差n个结点
慢指针在虚拟头结点部位
快指针和虚拟头结点之间的距离是n-1个结点
让两个指针同时向后移动
当快指针的下一个节点为空时
设置删除一个节点 删除的是慢节点后面的节点 就是slow.next
返回的是虚拟头结点.next
主要思想是找出要删除结点的位置
通过快慢指针的同时移动以及快指针.next为空两个条件
找到要删除的结点的前一个结点 然后进行删除操作
- 面试题 02.07. 链表相交
分别求出headA和headB的长度
if 比较一下长短 求出差值n
两个指针 一个指向短的最左边 一个指向长的从左往右数第n个
在这个if里面套一个while
while比较指针的链表是否相同
相同返回
不相同返回空
- 142.环形链表II
双指针 快指针fast 慢指针slow
fast = fast.next.next fast以2步的速度进入链表
slow = slow.next slow以1步的速度进入链表
while循环 以fast != null 为循环终止条件 如果为null了 则说明没环 返回没环
//修正 这里的条件是fast.next也不为空
在while循环当中 当fast指针指向的链表 等于 slow指向的链表 记录下这个相遇的结点 meet
再设置一个初始值 start
令start和meet同时以1步的速度前进 当二者的值相等时 记录下这个值所对应的下标 返回下标