一、逆序链表:
思路:
1、定义一个节点new_head来存放需要逆序的当前节点逆序后的下一个节点。例如:1->2->3->4->null,此时head节点是1,逆序后1的下一个节点应该是null,new_head存放的就是null;
2、通过while循环来逆序每一个节点。其中包括这几步:
2.1、临时变量temp保存当前节点逆序前的下一个节点,即1->2中节点2;
2.2、将当前节点的next改为new_head;
2.3、将head的值赋给new_head节点。
2.4、将temp的值赋给head;
3、如果当前节点的下一个节点为null,则结束循环,返回new_head
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
class Solution {
public ListNode reverseList(ListNode head) {
ListNode new_head = null;
while(head!=null){
ListNode temp = head.next;
head.next = new_head;
new_head = head;
head = temp;
}
return new_head;
}
}
二、逆序链表指定范围内的节点
比如1->2->3->4->5->6->7->8->null;反转n =2,m=5即n~m之间的节点;
思路:
1、首先需要定义modify_tail来保存反转链段的头节点(即:2),,并且定义一个pre_head来保存反转链段的头节点的前一个节点(即:1),后面需要来连接反转后的首节点(即:4);最后是定义result为返回的头节点(1);
2、可以将2->3->4单独取出,看做是需要反转的链表;使用3个参数即可,即:new_head记录反转前的前一个节点,用作反转后的下一个节点;其次是head记录当前节点,然后一次向下;temp临时记录当前节点的next节点。
3、当反转后,此时modift_tail(反转前的头节点)连接循环后的head节点。
4、最后需要判断pre_head是否为null,如果为null,则以为值n=1即从链表开头开始反转,此时他的pre_head即为null;所以反转后的new_head就是整个链表的头节点。result=new_head;pre_head不为null,pre_head连new_head。
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
ListNode pre_head =null;
ListNode result = head;
int len = n-m+1;
while(--m>0){
pre_head=head;
head = head.next;
}
//反转链表
//保存反转前的头结点
ListNode modify_tail = head;
ListNode new_head = null;
ListNode temp;
while(head!=null && (len-->0)){
temp = head.next;
head.next = new_head;
new_head = head;
head = temp;
}
//原链表和反转链表连接
modify_tail.next = head;
//如果pre_head为空,说明m=1
if(pre_head != null){
pre_head.next = new_head;
}else{
result = new_head;
}
return result;
}
}