最近刷题的时候刷到了剑指offter的单链表反转问题。因为工作需求,从头开始自学的Java,当初数据结构都是从C/C++起家的。所以再用Java做单链表反转的时候根据以往的思路,怎么改都不对。
但是由于苦于牛客网上没有源代码,供我进行调试。无奈之下,只好去整理了一下Java数据结构的资料。做了一个简易版的单链表的增删改查。
思路比较直观,可以帮助想研究Java单链表的担忧没有源代码可以参考的小白参考一下。
大佬看看就好,下面放代码:
`在这里插入代码public class ListNode {
int val; //链表中的值
int pos=1; //当前节点的位置
int total=0; //统计当期链表的总长度
ListNode next = null;
ListNode(){
this.head=null;
}
ListNode(int val) {
this.val = val;
}
void display(ListNode node){
System.out.print(node.val+" ");
}
ListNode head=null;
public void FirstAdd(int val){ //在首节点对链表进行插入
ListNode node=new ListNode(val);
node.next=head;
head=node;
total++;
}
public void Add(int index,int val){ //在第index位置对节点进行插入
ListNode newNode=new ListNode(val);
ListNode current=head;
ListNode pre=head;
if(total+1<index||index<=0){ //若输入的插入的节点位置小于或等于0,
return; //或者输入的节点位置大于了链表的长度+1时,
}else{ //会直接结束当前插入操作
if(index==1){ //头节点插入不同于中间节点插入,另作讨论
newNode.next=head;
head=newNode;
return;
}else {
current=current.next;
while (pos+1!=index){
pre=pre.next;
current=current.next;
pos++;
}
pre.next=newNode;
newNode.next=current;
}
total++;
pos=1;
}
}
public void DeleteHead(){ //删除头部
ListNode pre=head;
head=pre.next;
total--;
}
public void Delete(int index){ //删除指定的节点
ListNode current=head;
ListNode pre=head;
if(index>total||total<=0){
return;
}else {
if(index==1){
pre=head;
head=pre.next;
total--;
return;
}else {
current=current.next;
while(index-1!=pos){
pre=pre.next;
current=current.next;
pos++;
}
pre.next=current.next;
current=null;
total--;
}
}
pos=1;
}
public int Serach(int val){ //查找链表的下标
ListNode current=head;
while (current!=null){
if(current.val==val){
return pos;
}else {
pos++;
}
current=current.next;
}
return -1;
}
public void ReverseList(){ //单链表反转
}
public void print(){ //对链表进行打印
ListNode current=head;
while(current!=null){
display(current);
current=current.next;
}
System.out.println("");
}
public static void main(String[] args) {
ListNode node=new ListNode();
node.FirstAdd(1);
node.FirstAdd(2);
node.FirstAdd(3);
node.FirstAdd(4);
node.FirstAdd(5);
int index=node.Serach(1);
System.out.println("数值1的下标为"+index);
node.Add(6,10);
node.Delete(2);
node.print();
node.print();
}
}
关于单链表的反转部分,还没找到问题所在。后便博客会补上单链表的反转问题。以及双链表的问题,二叉树的遍历,二叉树的重构问题。