今日小闲话:在开始今日算法练习之前,简单把昨日所学的知识在力扣上独立敲了一下代码,需要注意的问题是变量初始化和小细节问题
反转链表题型练习(二)
练习题源:
反转链表巩固复习
题目:
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
代码(包含解题思路)
解法一:反转+拼接
class Solution {
public ListNode reverseBetween(ListNode head, int left, int right) {
ListNode dummy=new ListNode(0);
dummy.next=head;
//增加一个虚拟空节点dummy指向NULL
/*目标:移动指针,找到left和right的位置
找到L1和R1的位置 */
ListNode preleftNode=dummy;
for(int i=0;i<left-1;i++){
preleftNode=preleftNode.next;
}
ListNode leftNode=preleftNode.next;
//先找到left前面的那个元素
ListNode rightNode=dummy;
for(int i=0;i<right;i++){
rightNode=rightNode.next;
}
ListNode r1=rightNode.next;
rightNode.next=null;
//调用反转函数
reverseLinkedList(leftNode);
//拼接
preleftNode.next=rightNode;
leftNode.next=r1;
//dummy相当于head
return dummy.next;
}
//再写一个反转函数
private void reverseLinkedList(ListNode head){
ListNode prev=null;
ListNode curr=head;
ListNode next;
while(curr!=null){
next=curr.next;
curr.next=prev;
prev=curr;
curr=next;
}
}
}
解法二:穿针引线
class Solution {
public ListNode reverseBetween(ListNode head, int left, int right) {
ListNode dummy=new ListNode(0);
dummy.next=head;
//增加一个虚拟空节点dummy指向NULL
ListNode preleftNode=dummy;
for(int i=0;i<left-1;i++){
preleftNode=preleftNode.next;
}
ListNode leftNode=preleftNode.next;
//先找到left前面的那个元素
//上述与解法一相同,目的找到L1 L
ListNode preleft=leftNode;
//left后面的节点
for(int i=left+1;i<=right;i++){
ListNode curr=leftNode.next;
ListNode currNext=curr.next;
preleftNode.next=curr;
curr.next=preleft;
leftNode.next=currNext;
preleft=curr;
}
return dummy.next;
}
}