Java实现链表
package untils;
public class _Linked {
public static class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
/* 有头结点的链表 */
private ListNode head = new ListNode(0);
//添加节点到单向链表
//思路,当不考虑编号顺序时
//1. 找到当前链表的最后节点
//2. 将最后这个节点的next 指向 新的节点
public void add(ListNode heroNode) {
//因为head节点不能动,因此我们需要一个辅助遍历 temp
ListNode temp = head;
//遍历链表,找到最后
while(true) {
//找到链表的最后
if(temp.next == null) {
break;
}
//如果没有找到最后, 将将temp后移
temp = temp.next;
}
//当退出while循环时,temp就指向了链表的最后
//将最后这个节点的next 指向 新的节点
temp.next = heroNode;
}
/*
* 正向输出链表
*/
public void list() {
//判断链表是否为空
if(head == null) {
System.out.println("链表为空");
return;
}
//因为头节点,不能动,因此我们需要一个辅助变量来遍历
ListNode temp = head;
while(true) {
//判断是否到链表最后
if(temp == null) {
break;
}
//输出节点的信息
System.out.print(temp.val + " ");
//将temp后移, 一定小心
temp = temp.next;
}
System.out.println();
}
/*
* 反向输出链表,三种方式:
* 方法一、先反转链表,再输出链表,需要链表遍历两次
* 方法二、把链表中的数字放入栈中再输出,需要维护额外的栈空间
* 方法三、依据方法2中栈的思想,通过递归来实现,递归起始就是将先执行的数据压入栈中,再一次出栈
*/
public void reservePrt(ListNode head){
if (head != null){
reservePrt(head.next);
System.out.print(head.val+"->");
}
}
/*
删除值为number的节点
思路:
1. head 不能动,因此我们需要一个temp辅助节点找到待删除节点的前一个节点
2. 说明我们在比较时,是temp.next.no 和 需要删除的节点的no比较
*/
public void del(int number) {
ListNode temp = head;
boolean flag = false;
while(temp.next != null){
if(temp.next.val == number){
temp.next = temp.next.next;
flag = true;
}else{
temp = temp.next;
}
}
if(flag){
System.out.println("已删除值为" + + number + "的结点!" );
}else{
System.out.println("未找到值为" + + number + "的结点!" );
}
}
/* 修改节点的信息, 根据no编号来修改,即no编号不能改.
说明
1. 根据 newHeroNode 的 no 来修改即可
*/
public void update(Integer oldNumber,Integer newNumber) {
ListNode temp = head;
boolean flag = false;
while(temp.next != null){
if(temp.next.val == oldNumber){
temp.next.val = newNumber;
flag = true;
}else{
temp = temp.next;
}
}
if(flag){
System.out.println("已修改值为" + oldNumber + "的结点,修改后的值为" + newNumber);
}else{
System.out.println("未找到值为" + + oldNumber + "的结点!" );
}
}
public static void main(String args[]){
ListNode node = new ListNode(1);
/* 初始化的同时吧node设置为头结点 */
_Linked linked = new _Linked();
node = new ListNode(1);
linked.add(node);
node = new ListNode(2);
linked.add(node);
node = new ListNode(3);
linked.add(node);
node = new ListNode(4);
linked.add(node);
node = new ListNode(7);
linked.add(node);
node = new ListNode(3);
linked.add(node);
node = new ListNode(9);
linked.add(node);
node = new ListNode(4);
linked.add(node);
node = new ListNode(10);
linked.add(node);
linked.list();
linked.del(1);
linked.list();
linked.del(4);
linked.list();
linked.del(20);
linked.list();
linked.update(2,10);
linked.list();
/* 倒序输出 */
linked.reservePrt(linked.head);
}
}