Leetcode 24 力扣
解法:虚拟头节点,然后按照交换步骤执行
public ListNode swapPairs(ListNode head) { // 1 -> 2 ->3->4 虚拟头节点后 0 -> 2->1-> 4->3 ListNode pre = new ListNode(-1); // 设置一个虚拟头结点 pre.next = head; ListNode cur = pre; ListNode temp = null; // 临时节点,保存两个节点后面的节点 ListNode firstNode = null; // 两个节点中第一个节点 ListNode secondNode = null; // 两个节点中第二个节点 while (cur.next != null && cur.next.next != null){ temp = cur.next.next.next; firstNode = cur.next; secondNode = cur.next.next; cur.next = secondNode; // 步骤一 secondNode.next = firstNode; // 步骤二 firstNode.next = temp; // 步骤三 cur = firstNode; } return pre.next; }
Leetcode 19 力扣
解法:虚拟头节点+快慢指针确定倒数N的位置
// 倒数节点如何找?区别于第N个下标直接遍历即可;倒数位置需要使用快慢指针,让快指针先走N步,然后快慢指针同时移动 public ListNode removeNthFromEnd(ListNode head, int n) { ListNode pre = new ListNode(-1); pre.next = head; ListNode slow = pre; ListNode fast = pre; for (int i = 0; i < n; i++) { //快指针先走N步,然后同时移动快慢指针,实际走了n-1步,当快指针指向null时,慢指针指向倒数n的前一个位置 fast = fast.next; } while (fast.next != null){ slow = slow.next; // 顺序不能乱,快指针先走,快慢指针同时移动时候 fast = fast.next; // 顺序不能乱,慢指针后走,快慢指针同时移动时候 } slow.next = slow.next.next; return pre.next; }
Leetcode 02.07. 链表相交 力扣
解法:使用哈希先将链表1加入,遍历链表2时候判断哈希存在与否,存在即返回交点,不存在交点返回null
public ListNode getIntersectionNode(ListNode headA, ListNode headB) { Set<ListNode> nodes = new HashSet<>(); ListNode temp = headA; while (temp != null){ nodes.add(temp); temp = temp.next; } temp = headB; while (temp != null){ if (nodes.contains(temp)){ return temp; } temp = temp.next; } return null; }
Leetcode 142 力扣
解法:1.判断环如何判断?(快慢从head出发指针相遇,快指针走两段,慢指针走一段)
2.如何判断环入口?X=Z时候满足,定义index1为fast,index2从head出发,index1=index2满足
public ListNode detectCycle(ListNode head) { ListNode slow = head; ListNode fast = head; while (fast != null && fast.next != null){ slow = slow.next; fast = fast.next.next; if (slow == fast){ // 有环存在 ListNode index1 = fast; // 快指针先走 ListNode index2 = head; // 慢指针从head走 while (index1 != index2){ // 不相遇一直往前走 index1 = index1.next; index2 = index2.next; } return index1; } } return null; }