在单链表和双链表中删除倒数第k个节点
2017-10-26 10:28
393 查看
实现的完整代码如下:
//在单链表和双链表中删除倒数第k个节点 public class DeleteList{ //单链表节点的定义 public static class Node{ int value; Node next; public Node(int data) { this.value=data; } } //删除单链表中倒数第k个节点 public static int DeletList_K(Node head,int k) { Node t=head; //用t指向链表的头结点 if(head==null||k<1) { return -10000; //表示没有删除的数据 } int leng=0; //计算链表的长度 while(t!=null) { t=t.next; ++leng; } //System.out.println(leng); 打印出链表的长度为3 if(k>leng) { return -10000; //表示没有删除的数据 } for(int i=0;i<leng-k-1;i++) { head=head.next; //找到倒数第k-1个节点 } Node p=head.next; //找到倒数第k个节点 head.next=head.next.next; //删除倒数第k个节点 return p.value; } //双链表节点的定义 public static class Node2{ int value; Node2 next,pre; public Node2(int data) { this.value=data; } } //删除双链表中倒数第k个节点 public static int DelteTwoList_K(Node2 head2,int k) { Node2 t=head2; //用t指向链表的头结点 if(head2==null||k<1) { return -10000; } int leng=0; //计算双链表的长度 while(t!=null) { t=t.next; ++leng; } //System.out.println(leng); //打印出链表的长度为3 if(k>leng) { return -10000; //表示没有删除的数据 } for(int i=0;i<leng-k;i++) { head2=head2.next; } Node2 p=head2; //倒数第k个节点 p.pre.next=p.next; //删除倒数第k个节点 return p.value; } public static void main(String []args) { //删除单链表倒数第k个节点测试 链表为 1->2->3 Node node=new Node(1); node.next=new Node(2); node.next.next=new Node(3); //node.next.next.next=new Node(4); System.out.println(DeletList_K(node,2)); //删除双链表倒数第k个节点测试 链表为 1->2->3 Node2 node2=new Node2(1); node2.next=new Node2(2); node2.next.next=new Node2(3); node2.next.pre=node2; node2.next.next.pre=node2.next; //node.next.next.next=new Node(4); System.out.println(DelteTwoList_K(node2,2)); } }
左神的代码:
public class Problem_02_RemoveLastKthNode { public static class Node { public int value; public Node next; public Node(int data) { this.value = data; } } public static Node removeLastKthNode(Node head, int lastKth) { if (head == null || lastKth < 1) { return head; } Node cur = head; while (cur != null) { lastKth--; cur = cur.next; } if (lastKth == 0) { head = head.next; } if (lastKth < 0) { cur = head; while (++lastKth != 0) { cur = cur.next; } cur.next = cur.next.next; } return head; } public static class DoubleNode { public int value; public DoubleNode last; public DoubleNode next; public DoubleNode(int data) { this.value = data; } } public static DoubleNode removeLastKthNode(DoubleNode head, int lastKth) { if (head == null || lastKth < 1) { return head; } DoubleNode cur = head; while (cur != null) { lastKth--; cur = cur.next; } if (lastKth == 0) { head = head.next; head.last = null; } if (lastKth < 0) { cur = head; while (++lastKth != 0) { cur = cur.next; } DoubleNode newNext = cur.next.next; cur.next = newNext; if (newNext != null) { newNext.last = cur; } } return head; } public static void printLinkedList(Node head) { System.out.print("Linked List: "); while (head != null) { System.out.print(head.value + " "); head = head.next; } System.out.println(); } public static void printDoubleLinkedList(DoubleNode head) { System.out.print("Double Linked List: "); DoubleNode end = null; while (head != null) { System.out.print(head.value + " "); end = head; head = head.next; } System.out.print("| "); while (end != null) { System.out.print(end.value + " "); end = end.last; } System.out.println(); } public static void main(String[] args) { Node head1 = new Node(1); head1.next = new Node(2); head1.next.next = new Node(3); head1.next.next.next = new Node(4); head1.next.next.next.next = new Node(5); head1.next.next.next.next.next = new Node(6); printLinkedList(head1); head1 = removeLastKthNode(head1, 3); // head1 = removeLastKthNode(head1, 6); // head1 = removeLastKthNode(head1, 7); printLinkedList(head1); DoubleNode head2 = new DoubleNode(1); head2.next = new DoubleNode(2); head2.next.last = head2; head2.next.next = new DoubleNode(3); head2.next.next.last = head2.next; head2.next.next.next = new DoubleNode(4); head2.next.next.next.last = head2.next.next; head2.next.next.next.next = new DoubleNode(5); head2.next.next.next.next.last = head2.next.next.next; head2.next.next.next.next.next = new DoubleNode(6); head2.next.next.next.next.next.last = head2.next.next.next.next; printDoubleLinkedList(head2); head2 = removeLastKthNode(head2, 3); // head2 = removeLastKthNode(head2, 6); // head2 = removeLastKthNode(head2, 7); printDoubleLinkedList(head2); } }
相关文章推荐
- 链表之删除单链表倒数第K个节点
- 链表问题——在单链表和双链表中删除倒数第K个节点
- (算法)输出单链表的倒数第k个节点,删除特点的节点和从链表尾一次输出节点值
- [链表]-在单链表和双链表中删除倒数第K个节点
- 链表问题 在单链表和双链表中删除倒数第K个节点
- 链表问题---在单链表和双链表中删除倒数第K个节点
- 链表问题(1)-- 在单链表和双链表中删除倒数第K个节点
- 左程云_算法与数据结构 — 链表问题 — 02在单链表和双链表中删除倒数第K个节点
- 数据结构 在单链表和双链表中删除倒数第K个节点
- 链表排序、链表删除、访问倒数第k个节点
- 反转单链表+合并有序单链表+查找单链表中倒数第k个节点--20150924
- 链表面试题逆序打印,删除无头非尾节点,非头位置插入,约瑟夫环,查找中间和倒数第k个节点
- 删除链表中倒数第k个节点
- 查找单链表的倒数第k个节点,要求只能遍历一次链表(C语言)
- 链表--查找单链表的倒数第k个节点,要求只能遍历一次链表
- 链表面试题(六)---删除单链表倒数第k个结点
- [算法]在单链表和双链表中删除倒数第k个结点
- 逆置、翻转链表/查找单链表的倒数第k个节点/A+B不使用四则运算++ -- 等
- C语言:【单链表】查找单链表的倒数第k个节点,要求只能遍历一次
- 查找单链表的倒数第k个节点,要求只能遍历一次链表