一、反转链表1
1、问题描述
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
2、问题分析
设置采用三个指针,一个指针遍历原链表,一个指针应用于所求链表,最后一个指针是临时指针。
初始化两个指针p1,p2,p1=head;p2=null;
1->null,2->1,3->2…于是问题变成更新这两个指针了。
3、代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode p1 = head;
ListNode p2 = null;
ListNode temp; //临时指针
while(p1!=null){
temp = p1.next; //把p1指向下一位存储起来,用于遍历
p1.next = p2; //修改链表指向
p2 = p1; //所求链表指针向左移动一位
p1 = temp; //同时原链表指针向右移动一位
}
return p2;
}
}
二、反转链表2
1、问题描述
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
2、问题分析
可以参照前面的思路,主要是要定位到所需要反转链表的位置
3、代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
ListNode temp1;
ListNode temp2;
ListNode temp3;
ListNode pre = new ListNode(0); //创建虚拟节点
pre.next = head;
ListNode p1 = pre;
ListNode p2 = null;
for(int i=1;i<m;i++){
p1 = p1.next;
}
temp1 = p1; //标记t1
p1 = p1.next;
temp2 = p1; //标记t2
for(int i=1;i<=n-m+1;i++){ //反转
temp3 = p1.next;
p1.next = p2;
p2 = p1;
p1 = temp3;
}
temp1.next = p2;
temp2.next = p1; //连接反转后的链表
return pre.next;
}
}
三、K 个一组翻转链表
1、问题描述
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
2、问题分析
3、代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode pre = dummy;
ListNode tail = dummy;
while (true) {
int count = 0;
while (tail != null && count != k) { //p1尾部
count++;
tail = tail.next;
}
if (tail == null) break;
ListNode temp = pre.next;
while (pre.next != tail) {
ListNode cur = pre.next;
pre.next = cur.next;
cur.next = tail.next;
tail.next = cur;
}
pre = temp;
tail = temp;
}
return dummy.next;
}
}