1 两两交换链表中的结点
题目
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
代码
class Solution {
public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null)
return head;
ListNode dummyNode=new ListNode(0);
dummyNode.next=head;
ListNode pre=dummyNode,temp=head;
while(pre.next!=null && pre.next.next!=null){
temp=head.next.next;
pre.next=head.next;
head.next.next=head;
head.next=temp;
pre=head;
head=head.next;
}
return dummyNode.next;
}
}
错误总结
刚开始的思路由于没有添加虚拟头节点,忽略了交换的两结点与前面结点的连接(步骤1)。以后分析思考时,还是要添加虚拟头节点,这样才能更加具有普遍性。
2 删除链表的倒数第N个结点
题目
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
代码
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode pre=new ListNode(0);
pre.next=head;
ListNode fast=head,slow=head;
for(int i=0;i<n;i++)
fast=fast.next;
while(fast!=null){
pre=pre.next;
fast=fast.next;
slow=slow.next;
}
if(slow==head){
pre.next=head.next;
return pre.next;
}
else{
pre.next=slow.next;
return head;
}
}
}
错误总结
- 双指针
- 考虑当慢指针为头结点的情况
3 链表相交
题目
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
代码
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode curA=headA,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){
for(int i=0;i<lenB-lenA;i++)
curB=curB.next;
}
else{
for(int i=0;i<lenA-lenB;i++)
curA=curA.next;
}
while(curA!=curB){
curB=curB.next;
curA=curA.next;
}
if(curA!=null)
return curA;
else
return null;
}
}
错误总结
- 看到题目,首先的思路是两个循环,没想到这么巧妙的方法。
- 最后的输出记得判断。