小渣渣的算法学习笔记:2018秋招备战
数据结构类算法总结:链表
数据结构类算法总结:链表
1.题目描述:
O(1)时间内删除链表节点。 给定单向链表头指针和一个结点指针,定义一个函数在O(1)时间内删除该节点。
2.代码实现:
public class Solution69_18 { private static class ListNode { int value; ListNode next = null; ListNode(int val) { this.value = val; } } public static void main(String[] args) { Solution69_18 s = new Solution69_18(); ListNode l1 = new ListNode(1); ListNode l2 = new ListNode(2); ListNode l3 = new ListNode(3); ListNode l4 = new ListNode(4); ListNode l5 = new ListNode(5); l1.next = l2; l2.next = l3; l3.next = l4; l4.next = l5; s.deleteNode01(l1,l3); s.deleteNode02(l1,l1); s.printListNode(l1); } public ListNode deleteNode01(ListNode head, ListNode node) { // 检查空 if (node == null) { throw new RuntimeException(); } ListNode next = node.next; if (next != null) { // 有下一个节点的情况:复制覆盖 node.value = next.value; node.next = next.next; // 没有下一个节点的情况 } else { ListNode previous = null; ListNode current = head; while (current != null) { if (current == node) { // 前一个为空,要删除的节点即是第一个头结点 if (previous == null) { head = null; } else { // 前一个不为空,则将next置为null即可 previous.next = null; } } previous = current; current = current.next; } } return head; } public void printListNode(ListNode pHead){ while(pHead.next!=null){ System.out.print(pHead.value+" "); pHead = pHead.next; } System.out.print(pHead.value+" "); } public void deleteNode02(ListNode pHead,ListNode pDel){ if(pHead == null || pDel == null) return; //要删除的结点不是尾结点 if(pDel.next != null){ ListNode temp = pDel.next; pDel.value = temp.value; pDel.next = temp.next; } //只有一个结点 else if(pHead == pDel){ pDel = null; pHead = null; } //链表中多个节点,删除尾结点;需要从链表的头结点开始顺序遍历尾结点的前序结点,完成删除操作 else{ ListNode temp = pHead; while(temp.next!=pDel){ temp = temp.next; } temp.next = null; } } }