24.两两交换链表中的节点
代码示例
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode newHead = new ListNode(0,head);
ListNode p = newHead;
while(p.next != null && p.next.next != null)
{
ListNode x = p.next;
ListNode y = p.next.next;
x.next = y.next;
y.next = x;
p.next = y;
p = x;
}
return newHead.next;
}
}
心得体会
本题使用了一个哨兵节点 newHead,它的下一个节点是原链表的头节点 head。然后使用指针 p 遍历链表,每次交换 p 的下一个节点和下下个节点,然后将 p 指向交换后的第二个节点。最后返回哨兵节点的下一个节点,即交换后的链表头。
19.删除链表的倒数第n个节点
代码示例
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if(head == null){
return null;
}
ListNode left = head;
ListNode right = head;
for(int i = 1; i <= n ; i++){
right = right.next;
}
if(right == null){
return head.next;
}
while(right != null && right.next != null){
left = left.next;
right = right.next;
}
ListNode temp = left.next.next;
left.next = temp;
return head;
}
}
心得体会
本题首先判断链表是否为空,然后设置两个指针,一个慢指针和一个快指针,快指针先走n步。如果快指针已经过界,说明要删除的是头节点,直接返回head.next。否则,慢指针和快指针一起向后移动,直到快指针到达链表末尾。最后,删除慢指针的下一个节点即可。
面试题02.07.链表相交
代码示例
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode h1 = headA, h2 = headB;
while (h1 != h2) {
h1 = h1 == null ? headB : h1.next;
h2 = h2 == null ? headA : h2.next;
}
return h1;
}
心得体会
构造方法接受两个链表headA和headB,并返回它们相交的节点。该方法使用两个指针h1和h2遍历链表。如果h1和h2不相等,则方法将h1移动到headA中的下一个节点,将h2移动到headB中的下一个节点。如果h1或h2到达其各自链表的末尾,则将其设置为另一个链表的头。此过程继续,直到h1和h2相等,此时返回h1。