链表代码如下:
public class MySingletonList {
Node head = new Node(null);
//添加节点:
public boolean add(Node data){
Node temp = head;
//先要找到链表的最后一个节点,新加的节点就要加到链表的最后,
while(true){
if(temp.next == null){
break;
}
temp = temp.next;//头结点往后移动
}
temp.next = data;//把新加的节点加到后面。
return true;
}
//打印链表
public void showList(){
Node temp = head.next;
if(temp == null){
System.out.println("空链表");
return;
}
while(true){
if(temp == null){
break;
}
System.out.println(temp.data);
temp = temp.next;//往后移动
}
}
//反转链表 这是抄博客上的写法的,我自己对循环内的代码也还是一知半解
public Node reversList(Node head){
Node pre = null;
Node next = null;
while (head != null) {
next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
}
//节点类的代码,我贪图方便,就不写成内部类了
class Node{
public Object data;
public Node next;
public Node(Object data){
this.data = data;
}
@Override
public String toString() {
return "Node [data=" + data + ", next=" + next + "]";
}
}
这一步完全就是照抄的,都错了,我自己想的更加没法看,求大神看看,我究竟错哪里了?
以下是测试代码:
public class Test {
public static void main(String[] args) {
MySingletonList list = new MySingletonList();
Node n1 = new Node(1);
Node n2 = new Node(2);
Node n3 = new Node(3);
Node n4 = new Node(4);
list.add(n1);
list.add(n2);
list.add(n3);
list.add(n4);
list.showList();
System.out.println("@@@@@@@@@@");
list.reversList(list.getHead().next);
list.showList();
}
}
控制台出来的结果是这样的
1
2
3
4
@@@@@@@@@@
空链表
楼主,reversList(Node head);这个方法 return pre; 之前加上这一句 this.head.next = pre; 应该就可以了。
public Node reversList(Node head){
........
while (head != null) {
.........
}
this.head.next = pre; // 加上这一句,因为链表翻转了,所以要 更新头节点的下一个节点。
return pre;
}
谢谢!
@lukely: 不客气。
这个编辑器可以格式化代码的:
class Node{
public Object data;
public Node next;
public Node(Object data){
this.data = data;
}
@Override
public String toString() {
return "Node [data=" + data + ", next=" + next + "]";
}
}
添加节点创建成一个链表:
public boolean add(Node data){
Node temp = head;
//先要找到链表的最后一个节点,新加的节点就要加到链表的最后,
while(true){
if(temp.next == null){
break;
}
temp = temp.next;//头结点往后移动
}
temp.next = data;//把新加的节点加到后面。
return true;
}
反转的代码:
public Node reversList(Node head){
Node pre = null;
Node next = null;
while (head != null) {
next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
遍历链表的代码:
//打印链表
public void showList(){
Node temp = head.next;
if(temp == null){
System.out.println("空链表");
return;
}
while(true){
if(temp == null){//如果当前节点为null,退出循环。
break;
}
System.out.println(temp.data);
temp = temp.next;//往后移动
}
}
看不出哪里错了,结果不对吗?最好贴上完整的代码,并且格式化一下。
谢谢,我不知道怎么设置这里的代码格式。我百度一下看看。
@lukely:修改一下reversList方法吧。
反转根本就不用传参数了:
public void reversList(){
Node pre = null;
Node next = null;
while (head != null) {
next = head.next;
head.next = pre;
pre = head;
head = next;
}
if (pre != null){
head = pre
}
}
我没有Java环境,不确保是否正确,大概是这样子。不用传参数,反转自己不需要别的参数啊。反转后把head指向原来未反转时最后一个元素就好了。
@会长: 我知道问题出在哪里了
问题出现在打印链表的函数里。因为这个函数的错误,干扰了对后面的判断。谢谢你。
public void showList(){
Node temp = head.next;
if(temp == null){
System.out.println("空链表");
return;
}
while(true){
if(temp == null){//如果当前节点为null,退出循环。
break;
}
System.out.println(temp.data);
temp = temp.next;//往后移动
}
}
@lukely: 哦,是有问题。不过反转那个函数传入一个参数确实是没有必要、
@会长: 请问这个格式化代码 是怎么弄的?
@Jinke2017: 在代码头 英文状态下 按下1 右边的 按三下 代码结束后,再来三下
。
@lukely: 明白了,谢谢。