两两交换链表中的节点 leetcode24
递归
class Solution {
public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null){
return head;
}
ListNode cur = head;
ListNode next = cur.next;
ListNode node = swapPairs(next.next);
next.next = cur;
cur.next = node;
return next;
}
}
非递归
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode pre = dummy;
ListNode node1;
ListNode node2;
while (pre.next != null && pre.next.next != null) {
node1 = pre.next;
node2 = pre.next.next;
pre.next = node2;
node1.next = node2.next;
node2.next = node1;
pre = node1;
}
return dummy.next;
}
}
删除链表的倒数第N个节点 leetcode19
快慢指针
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode slow = dummy;
ListNode fast = dummy;
for(int i = 0; i < n; i++){
fast = fast.next;
}
while(fast.next != null){
slow = slow.next;
fast = fast.next;
}
slow.next = slow.next.next;
return dummy.next;
}
}
面试题 02.07. 链表相交
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode p1 = headA;
ListNode p2 = headB;
while(p1 != p2){
if(p1 == null){
p1 = headB;
}else{
p1 = p1.next;
}
if(p2 == null){
p2 = headA;
}else{
p2 = p2.next;
}
}
return p1;
}
}
环形链表 II leetcode142
public class Solution {
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 b = fast;
ListNode a = head;
while (a != b) {
a = a.next;
b = b.next;
}
return a;
}
}
return null;
}
}
链表总结