这个专题总共有四道题目
206 翻转链表
92 翻转链表某个区间(翻转链表||)
24 两个一组翻转链表
25 k个一组翻转链表
力扣206 翻转链表
其实就是头插法创建一个新链表
总共三个指针,dummy和head这两个指针是肯定是不用说的,无非是多了一个指向head指针下一个结点的temp指针
核心就是下面这两行代码:
head.next=dummy.next;
dummy.next=head;
class Solution
{
public ListNode reverseList(ListNode head)
{
if(head==null) return null;
ListNode dummy=new ListNode(-1);
while(head!=null)
{
//temp用来标记这一轮要插入结点的下一个结点(也就是下一轮要插入的结点,要不然下一轮找不到位置)
ListNode temp=head.next;
//这两行就是头插法插入结点到dummy结点的后面
head.next=dummy.next;
dummy.next=head;
head=temp;
}
return dummy.next;
}
}
92.力扣 翻转链表某个区间(翻转链表||)
反转链表的某个区间
核心代码:
temp.next=q.next;
q.next=temp
class Solution
{
public ListNode reverseBetween(ListNode head, int m, int n)
{
ListNode dummy = new ListNode(0);
dummy.next = head;
// 初始化指针,一前一后,p在前,q在后,先p后q
ListNode q = dummy;
ListNode p = dummy.next;
// p移到第一个要反转的结点位置,q移动到第一个要反转的结点的前一个结点
for(int i= 0; i < m - 1; i++)
{
p = p.next;
q = q.next;
}
// 头插法插入节点
for (int i = 0; i < n - m; i++)
{
//存下来p指针后面的结点,将它用头插法插入到q指针后面去
ListNode temp = p.next;
//从链表中删除刚刚的temp结点
p.next = p.next.next;
//下面两行代码就是头插法,插入temp结点到g指针指向结点的
temp.next = q.next;
q.next = temp;
}
return dummy.next;
}
力扣24 两个一组翻转链表
class Solution
{
public ListNode swapPairs(ListNode head)
{
ListNode dummy=new ListNode(0);
dummy.next=head;
ListNode current=dummy;
//交换的是current的后面两个节点
while(current.next!=null&¤t.next.next!=null)
{
ListNode p=current.next;
ListNode q=current.next.next;
ListNode temp=current.next.next.next;
current.next=q;
q.next=p;
p.next=temp;
current=p;
}
return dummy.next;
}
}
力扣 25 k个一组翻转链表
注意两点:
(1)先把prev指针和end指针的位置确定好,然后start=prev.next即可,next=end.next即可
(2)一轮之后,prev=start(此时start和end的位置是start在右边,end的位置在左边)
end=prev(这就又把下轮的prev和end位置确定好了)
class Solution {
public ListNode reverseKGroup(ListNode head, int k)
{
ListNode dummy=new ListNode(0);
dummy.next=head;
ListNode prev=dummy;
ListNode end=dummy;
while(end.next!=null)
{
for(int i=0;i<k&&end!=null;i++)//找到end指针的位置
{
end=end.next;
}
if(end==null) break;//不足k个结点,这k个结点不用反转
ListNode start=prev.next;
ListNode next=end.next;
end.next=null;//断开end指针
prev.next=reverse(start);//将start-end区间进行反转
start.next=next;//重新将链表连起来
prev=start;//此时end指针在左,start指针在右
end=prev;
}
return dummy.next;
}
public ListNode reverse(ListNode head)
{
ListNode dummy=new ListNode(-1);
dummy.next=null;
while(head!=null)
{
ListNode p=head.next;
head.next=dummy.next;
dummy.next=head;
head=p;
}
return dummy.next;
}
}