数据结构与算法-链表

链表
链表是面试时被提及最频繁的数据结构。链表就是通过指针将一个个节点连接起来。链表是非连续的动态内存空间,链表的查找比数组慢,但是添加和删除比数组快。
链表声明

1 public class ListNode {
2     int val;
3     ListNode next;
4     public ListNode(int val) {
5         this.val = val;
6         this.next = null;
7     }
8 }            

链表的添加

 1 public void insertList(ListNode head, int val) {
 2     ListNode tempNode = new ListNode(val);
 3     if (head == null) {
 4         head = tempNode;
 5     }else {
 6         ListNode p = head;
 7         while (p.next != null) {
 8             p = p.next;
 9         }
10         p.next = tempNode;
11     }
12 }    

链表的删除

 1 public void deleteListNode(ListNode head, int val) {
 2     if (head ==null) return;//为了鲁棒性
 3     if (head.val == val) {//头节点为要删除节点
 4         head = head.next;
 5     } else {
 6         ListNode p = head;
 7         //删除节点需要知道前一个节点,所以判断p.next.val是不是和目标相等
 8         while (p.next !=null && p.next.val != val) {
 9             p = p.next;
10         }
11         if (p.next !=null) {
12             p.next = p.next.next;//删除节点
13         }
14     }
15 }

从尾到头打印链表
方法1:使用栈结构

 1 public void printList1(ListNode head) {
 2     if (head == null) return;
 3     Stack<ListNode> stack = new Stack<ListNode>();
 4     ListNode p = head;
 5     while (p != null) {
 6         stack.push(p);
 7         p = p.next;
 8     }
 9     while (!stack.isEmpty()) {
10         p = stack.pop();
11         System.out.print(p.val+" ");
12     }
13 }

 

方法2:递归

1 public void printList2 (ListNode head) {
2     if (head != null) {
3         if (head.next != null) {
4             printList2(head.next);
5         }
6         System.out.print(head.val+" ");
7     }
8 }

注:递归的过程相当于栈。


反转单链表

 1 public ListNode reverseList (ListNode head) {
 2     ListNode pre = null;
 3     ListNode next;
 4     while (head != null) {
 5         next = head.next;
 6         head.next = pre;
 7         pre = head;
 8         head = next;
 9     }
10     return pre;
11 }

反转双链表

 1 public class DoubleNode {
 2     public int val;
 3     public DoubleNode pre;
 4     public DoubleNode next;
 5     public DoubleNode (int val){
 6         this.val=val;
 7     }
 8 }
 9 public Node reverseList(Node head){
10     DoubleNode pre=null;
11     DoubleNode next=null;
12     while(head!=null){
13         //反转第一个节点
14         next=head.next;//记录下一个节点
15         head.next=pre;//反转当前节点:next指针指向上一个节点
16         head.pre=next;//反转当前节点:pre指针指向下一个节点
17         pre=head;//记录当前节点为下一个节点的pre
18         head=next;//移动到下一个节点
19     }
20     return pre;//返回新头节点
21 }

 

学习数据结构与算法的记录和整理,如有错误或意见请帮忙指出,以后会持续更新。。。。


参考书籍:
《程序员代码面试指南:IT名企算法与数据结构题目最优解》—左程云
《剑指Offer》 —何海涛

 
posted @ 2018-09-21 17:10 hiyoung 阅读(...) 评论(...) 编辑 收藏