链表的构建和基本操作
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 }