链表类题型-反转类
1.从头到尾反转链表
/**
* 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 reverseList(ListNode head) {
ListNode pre =null;
ListNode curr = head;
while(curr!=null){
ListNode next = curr.next;
curr.next = pre;
pre = curr;
curr = next;
}
return pre;
}
}
2.给定区间反转链表
/**
* 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 reverseBetween(ListNode head, int left, int right) {
ListNode temp = new ListNode(0,head);
ListNode pre = temp;
for(int i=1;i<left;i++){
pre = pre.next;
}
ListNode curr = pre.next;
ListNode next=null;
for(int i =1;i<=right-left;i++){
next = curr.next;
curr.next = next.next;
next.next = pre.next;
pre.next = next;
}
return temp.next;
}
}
3.两个一组反转链表
/**
* 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) {
ListNode temp = new ListNode(0,head);
ListNode res = temp;
while(temp.next!=null&&temp.next.next!=null){
ListNode node1 = temp.next;
ListNode node2 = temp.next.next;
node1.next = node2.next;
node2.next =node1;
temp.next = node2;
temp = node1;
}
return res.next;
}
}
4.k个一组反转链表
/**
* 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 reverseKGroup(ListNode head, int k) {
ListNode temp = new ListNode(0,head);
ListNode pre = temp;
ListNode end = temp;
while(end.next!=null){
for(int i =0;i<k&&end!=null;i++){
end = end.next;
}
if(end == null) break;
ListNode start = pre.next;
ListNode next = end.next;
end.next = null;
pre.next = reverse(start);
start.next = next;
pre = start;
end =pre;
}
return temp.next;
}
public ListNode reverse(ListNode head) {
ListNode pre =null;
ListNode curr =head;
while(curr!=null){
ListNode next = curr.next;
curr.next = pre;
pre = curr;
curr = next;
}
return pre;
}
}