链表的构建和基本操作

1.链表的构建:定义好头节点,并不断向链表的尾部加入节点

(1).建立一个头节点,并定义好节点的含义:

 1 /*
 2      * 链表的基本定义:头节点 + 接下来的各节点 
 3      * 各节点因为要指向下一个结点,所以包含两个元素,即本身的值和指向下一个结点的指针
 4      */
 5     Node head = null;//头节点
 6     class Node {
 7         int num;
 8         Node next = null;//用于指向下一个结点的引用
 9         
10         public Node(int num) {
11             this.num = num;
12         }
13     }

(2).在链表的尾部不断加入新节点:

 1 //链表的构建:使用add函数每次依次在链表尾部添加一个元素
 2     public void add(int d) {
 3         Node newNode = new Node(d);//实例化一个结点,这个结点即为要插入的数产生的新节点
 4         if (head == null) {//头节点为空,就把这个新节点放到头节点中
 5             head = newNode;
 6             return;
 7         }
 8         Node tmp = head;//这个tmp结点用来遍历链表(头节点不能动,所以创一个临时变量用来遍历)
 9         while (tmp.next != null) {
10             tmp = tmp.next;
11         }
12         newNode.next = null;
13         tmp.next = newNode;
14     }

 

2.链表的基本操作:
(1).链表的指定位置插入:

 1 //链表的插入:在链表的k位置插入一个结点元素
 2     public void insert(int d,int k) {
 3         Node newNode = new Node(d);
 4         if (k == 0) {
 5             newNode.next = head;
 6             head = newNode;
 7         }
 8         else {
 9             Node p = head;
10             for (int i = 1; i < k; i++) {
11                 p = p.next;
12             }
13             Node q = p.next;
14             p.next = newNode;
15             newNode.next = q;
16         }
17     }

(2).链表的指定位置删除:

 1 //链表的删除:在链表的k位置删除一个结点元素 
 2     public Node delete(int k) {
 3         Node ans = null;
 4         if (k == 0) {
 5             ans = head;
 6             head = head.next;
 7         }
 8         else {
 9             Node prev = head;
10             for (int i = 1; i < k; i++) {
11                 prev = prev.next;
12             }
13             Node p = prev.next;
14             prev.next = p.next;
15             ans = p;
16         }
17         return ans;
18     }

(3).链表的打印:

1 //链表的打印
2     public void print() {
3         Node p = head;
4         while (p!= null) {
5             System.out.print(p.num + " ");
6             p = p.next;
7         }
8         System.out.println();
9     }

 

3.链表的高级操作:
(1),链表的翻转:

 

 1 //链表的翻转
 2     public void reverse() {
 3         if (head == null || head.next == null) {//链表长度为0或1,无需翻转
 4             return;
 5         }
 6         //先确定3个节点p,q,r来进行存储,在原链表中三个节点关系满足p->q->r
 7         Node p = head, q = p.next;
 8         p.next = null;//不要忘了把第一个节点的下一项指向null,否则会进入死循环
 9         Node r = null;//此处r不要急着写r=q.next;(否则又要多讨论一个链表长度为2的情况)
10         while (q != null) {
11             r = q.next;//在此处确定q->r,避免了q=null时的r=null->next的报错情况
12             q.next = p;
13             p = q;
14             q = r;
15         }
16         head = p;//头指针指到最后一个
17     }

 

posted @ 2022-04-08 10:57  jue1e0  阅读(321)  评论(0)    收藏  举报