代码随想录算法训练营
今日任务
24. 两两交换链表中的节点 ,19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交 ,142.环形链表II
24. 两两交换链表中的节点
/**
* 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 swapPairs(ListNode head) {
if(head==null){
return null;
}
ListNode list=head;
int temp;
while(list.next!=null){
temp=list.val;
list.val=list.next.val;
list.next.val=temp;
if(list.next.next!=null){
list=list.next.next;
}else{
list=list.next;
}
}
return head;
}
}
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 size=0;
ListNode list=head;
while(list!=null){
list=list.next;
size++;
}
int pos=size-n;
if(pos==0){
return head.next;
}
ListNode newlist=head;
for (int i = 0; i < size; i++) {
if(i+1==pos){
newlist.next=newlist.next.next;
}else{
newlist=newlist.next;
}
}
return head;
}
}
面试题 02.07. 链表相交
同:160.链表相交
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
//要注意,是结点相等,而不是结点的值相等
//能过就行咯
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode result=null;
ListNode listA=headA;
ListNode listB=headB;
int sizeA=getLength(listA);
int sizeB=getLength(listB);
if(sizeA<=sizeB){
//A比B短
ListNode nodeA=headA;
ListNode nodeB=headB;
//是否找到
int flag=0;
while(nodeA!=null){
if(flag==1){
break;
}
int value=nodeA.val;
while(nodeB!=null){
if(value!=nodeB.val){
nodeB=nodeB.next;
}else{
if(nodeA== nodeB){
flag=1;
result=nodeA;
break;
}else{
nodeB=nodeB.next;
}
}
}
nodeA=nodeA.next;
nodeB=headB;
}
}else{
//A比B长
ListNode nodeB=headB;
ListNode nodeA=headA;
//是否找到
int flag=0;
while(nodeB!=null){
if(flag==1){
break;
}
int value=nodeB.val;
while(nodeA!=null){
if(nodeA.val!=value){
nodeA=nodeA.next;
}else{
if(nodeA==nodeB){
flag=1;
result=nodeA;
break;
}else{
nodeA=nodeA.next;
}
}
}
nodeB=nodeB.next;
nodeA=headA;
}
}
return result;
}
public int getLength(ListNode list){
ListNode node=list;
int size=0;
while(node!=null){
size++;
node=node.next;
}
return size;
}
}
142.环形链表II
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode detectCycle(ListNode head) {
//判断有没有环需要用快慢指针
//前面理解错意思了,交上去直接超出时间限制(什么鬼)
//注意:这个环的位置是判断的代码里给的,也就是位置随机
ListNode fastNode=head;
ListNode slowNode=head;
while(fastNode!=null&&fastNode.next!=null){
fastNode=fastNode.next.next;
slowNode=slowNode.next;
if(fastNode==slowNode){
//说明是有环的
//接下来寻找起始点
ListNode node1=head;
ListNode node2=slowNode;
while(node1!=node2){
node1=node1.next;
node2=node2.next;
}
return node1;
}
}
return null;
}
}