leetcode----链表1

一、逆序链表:

思路:
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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值