写在前面:
为了增长一下自己的数据结构能力,也为了面试准备,准备将剑指Offer做一下,并与各位分享,希望各位可以对代码以及思路提提建议,欢迎志同道合者,谢谢。
题目:
输入一个链表,反转链表后,输出新链表的表头。
大三的发生的环境
思路:
假设链表
1-2-3-4-5-6-7
长度为7的链表,要反转为7-6-5-4-3-2-1
我们新建一个链表头,一个中间节点k(用于交换的), 第一步,我们将1这个节点的next赋值给中间节点k,然后我们将1这个节点设置为链表头,1的next为null,然后我们在将k这个节点保存,然后k的next设置为k,前面保存的k设置为链表头,next设置为1
代码实现
package com.itzmn.offer;
/**
* @Auther: 张梦楠
* @Date: 2018/7/30 10:24
* 简书:https://www.jianshu.com/u/d611be10d1a6
* 码云:https://gitee.com/zhangqiye
* @Description:
*/
public class Offer15 {
public static void main(String[] args) {
new Offer15().init();
}
private void init() {
ListNode listNode = new ListNode(2);
ListNode listNode1 = new ListNode(3);
ListNode listNode3 = new ListNode(4);
ListNode listNode4 = new ListNode(5);
ListNode listNode5 = new ListNode(6);
listNode.next = listNode1;
listNode1.next = listNode3;
listNode3.next = listNode4;
listNode4.next = listNode5;
ListNode listNode2 = ReverseList(listNode);
display(listNode2);
}
/**
* 反转链表,返回新链表的表头
* 思路:
* 将每个节点分开之后,将后一个节点的next指向前一个节点
* @param head
* @return
* 1 2 3
*/
public ListNode ReverseList(ListNode head) {
//保存链表节点的前一个节点
ListNode pre = null;
//保存链表节点的下一个节点
ListNode next = null;
while (head != null){
next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public void display(ListNode node){
while (node != null){
System.out.print(node.val +" ");
node = node.next;
}
System.out.println();
}
}
希望大家可以多多指点,优化一下,
QQ群:552113611