日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

移除单链表的倒数第N个节点

發布時間:2024/9/21 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 移除单链表的倒数第N个节点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

原題

  Given a linked list, remove the nth node from the end of list and return its head.
  For example,

Given linked list: 1->2->3->4->5, and n = 2.After removing the second node from the end, the linked list becomes 1->2->3->5.
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

  Note:
  Given n will always be valid.
  Try to do this in one pass.

題目大意

  刪除單鏈表的倒數第N個結點,注意:輸入的N都是合法,在一次遍歷中完成操作。

解題思路

  先讓一個指針走找到第N個節點,然后再讓一個指針指向頭結點,然后兩具指針一起走,直到前一個指針直到了末尾,后一個指針就是倒數第N+1個結點,刪除倒數第N個結點就可以了。

代碼實現

鏈表結點類

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

算法實現類

public class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode pa = head;ListNode pb = head;// 找到第n個結點for (int i = 0; i < n && pa != null; i++) {pa = pa.next;}if (pa == null) {head = head.next;return head;}// pb與pa相差n-1個結點// 當pa.next為null,pb在倒數第n+1個位置while (pa.next != null) {pa = pa.next;pb = pb.next;}pb.next = pb.next.next;return head;} }

?

第一種方式:
1.首先判斷K值和鏈表是否為空,如果k<=0,或鏈表為空,直接返回head;
2.滿足上面條件后,定義ListNode P=head,重頭開始遍歷鏈表,走k步后,退出循環(在此循環中,如果沒到K不p就為null了,說明沒有倒數第K個節點,k大于表長度了,直接返回head)。
3.定義ListNode q = head,與p同步向后走,直到p的next為空時候,節點為要刪除節點的前一個結點。

第二種方式:
1.首先判斷K值和鏈表是否為空,如果k<=0,或鏈表為空,直接返回head;
2.遍歷一遍鏈表,每走一步,讓k值減1.
3.遍歷完后,如果k大于零,說明k大于鏈表長度,直接返回head;如果k等于0,要刪除的節點就是頭結點,直接返回head.next;如果k小于0時候第4步。
4.定義q=head,從新遍歷節點,每走一步k加1,直到k=0時候,退出循環,此時q的下一個節點就是要刪除的節點。

(4.解析:在這部分,為什么這樣做,可能不是很容易理解,給大家舉個例子,假如現在有一鏈表有8個節點,k=3.那么,前三步后,k=-5。大家想一想,k等于三是要刪除倒數第3個節點,我們只要從頭走5步就可以到達刪除節點的前一個節點了,為啥是5,因為8 = 3+5。說道這里不知道你明白沒有。)

Java代碼如下(測試過)

package bjtu.edu.cn1;public class ListNodeTest {// 2.在單鏈表中刪除倒數第k個節點(方法一)public static ListNode removeLastKthNode(ListNode head, int k) {if (k <= 0 || head == null)return head;ListNode p = head;for (int i = 0; i < k; i++) {if (p.nextNode != null)p = p.nextNode;elsereturn head;}ListNode q = head;while (p.nextNode != null) {p = p.nextNode;q = q.nextNode;}q.nextNode = q.nextNode.nextNode;return head;}// 2.在單鏈表中刪除倒數第k個節點(方法二)public static ListNode removeLastKthNode2(ListNodehead, int k) {if(k <= 0 ||head == null)return head;ListNode p = head;while(p!=null){p = p.nextNode;k--;}if(k==0)return head.nextNode;if(k<0){ListNode q = head;while(++k!=0){ //這里注意,先自加,在判斷q=q.nextNode;}q.nextNode=q.nextNode.nextNode;}return head;}// 創建鏈表public static ListNode creatListNode(int data[]) {ListNode head = new ListNode (data[0]);ListNode temp = head;for (int i = 1; i < data.length; i++) {ListNode headNext = new ListNode(data[i]);temp.nextNode = headNext;temp = temp.nextNode;}return head;}// 測試個方法public static void main(String[] args) {int[] data1 = { 1, 2, 4, 5, 6, 7 };ListNode head1 = creatListNode(data1);//在單鏈表中刪除倒數第k個節點ListNode head = removeLastKthNode2(head1, 1);while (head != null) {System.out.println(head.values);head = head.nextNode;}} }// 鏈表節點類 class ListNode {public int values;public ListNode nextNode;public ListNode(int data) {this.values = data;}}

轉載于:https://my.oschina.net/u/2822116/blog/804951

總結

以上是生活随笔為你收集整理的移除单链表的倒数第N个节点的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。